aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2020-08-31 19:00:59 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2020-08-31 19:01:02 +0200
commitd8cf52b993bf5c1f7721f838f68ba9e5e10d4774 (patch)
tree58deb0483721b6f9726b475fd2440db6912de043 /src
parentd9e04177a263bb1ac1075c097fe4950f6c18f106 (diff)
socket: Fix bug in osmo_sock_init2(AF_UNSPEC) matching IP versions
See previous commit for a bug description. Fixes: 2c962f5de1eeea119cfac7d9d92db31c570353b9 Change-Id: I59bf4b4b3ed14766a5a5285923d1ffa9fc8b2294
Diffstat (limited to 'src')
-rw-r--r--src/socket.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/src/socket.c b/src/socket.c
index e8a2ce25..56f01dc7 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -316,19 +316,27 @@ int osmo_sock_init2(uint16_t family, uint16_t type, uint8_t proto,
}
}
- /* priotize ipv6 as per RFC */
- if (local_ipv6 && remote_ipv6)
- family = AF_INET6;
- else if (local_ipv4 && remote_ipv4)
- family = AF_INET;
- else {
- if (local)
- freeaddrinfo(local);
- if (remote)
- freeaddrinfo(remote);
- LOGP(DLGLOBAL, LOGL_ERROR, "Unable to find a common protocol (IPv4 or IPv6) for local host: %s and remote host: %s.\n",
- local_host, remote_host);
- return -ENODEV;
+ if ((flags & OSMO_SOCK_F_BIND) && (flags & OSMO_SOCK_F_CONNECT)) {
+ /* prioritize ipv6 as per RFC */
+ if (local_ipv6 && remote_ipv6)
+ family = AF_INET6;
+ else if (local_ipv4 && remote_ipv4)
+ family = AF_INET;
+ else {
+ if (local)
+ freeaddrinfo(local);
+ if (remote)
+ freeaddrinfo(remote);
+ LOGP(DLGLOBAL, LOGL_ERROR,
+ "Unable to find a common protocol (IPv4 or IPv6) "
+ "for local host: %s and remote host: %s.\n",
+ local_host, remote_host);
+ return -ENODEV;
+ }
+ } else if ((flags & OSMO_SOCK_F_BIND)) {
+ family = local_ipv6 ? AF_INET6 : AF_INET;
+ } else if ((flags & OSMO_SOCK_F_CONNECT)) {
+ family = remote_ipv6 ? AF_INET6 : AF_INET;
}
}