diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2020-08-31 19:00:59 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2020-08-31 19:01:02 +0200 |
commit | d8cf52b993bf5c1f7721f838f68ba9e5e10d4774 (patch) | |
tree | 58deb0483721b6f9726b475fd2440db6912de043 /src | |
parent | d9e04177a263bb1ac1075c097fe4950f6c18f106 (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.c | 34 |
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; } } |