<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/19919">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">socket: Fix bug in osmo_sock_init2(AF_UNSPEC) matching IP versions<br><br>See previous commit for a bug description.<br><br>Fixes: 2c962f5de1eeea119cfac7d9d92db31c570353b9<br><br>Change-Id: I59bf4b4b3ed14766a5a5285923d1ffa9fc8b2294<br>---<br>M src/socket.c<br>M tests/socket/socket_test.c<br>M tests/socket/socket_test.err<br>3 files changed, 22 insertions(+), 15 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/19/19919/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/socket.c b/src/socket.c</span><br><span>index e8a2ce2..56f01dc 100644</span><br><span>--- a/src/socket.c</span><br><span>+++ b/src/socket.c</span><br><span>@@ -316,19 +316,27 @@</span><br><span>                      }</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           /* priotize ipv6 as per RFC */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (local_ipv6 && remote_ipv6)</span><br><span style="color: hsl(0, 100%, 40%);">-                  family = AF_INET6;</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (local_ipv4 && remote_ipv4)</span><br><span style="color: hsl(0, 100%, 40%);">-                     family = AF_INET;</span><br><span style="color: hsl(0, 100%, 40%);">-               else {</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (local)</span><br><span style="color: hsl(0, 100%, 40%);">-                              freeaddrinfo(local);</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (remote)</span><br><span style="color: hsl(0, 100%, 40%);">-                             freeaddrinfo(remote);</span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGP(DLGLOBAL, LOGL_ERROR, "Unable to find a common protocol (IPv4 or IPv6) for local host: %s and remote host: %s.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                            local_host, remote_host);</span><br><span style="color: hsl(0, 100%, 40%);">-                  return -ENODEV;</span><br><span style="color: hsl(120, 100%, 40%);">+               if ((flags & OSMO_SOCK_F_BIND) && (flags & OSMO_SOCK_F_CONNECT)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* prioritize ipv6 as per RFC */</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (local_ipv6 && remote_ipv6)</span><br><span style="color: hsl(120, 100%, 40%);">+                                family = AF_INET6;</span><br><span style="color: hsl(120, 100%, 40%);">+                    else if (local_ipv4 && remote_ipv4)</span><br><span style="color: hsl(120, 100%, 40%);">+                           family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+                     else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                if (local)</span><br><span style="color: hsl(120, 100%, 40%);">+                                    freeaddrinfo(local);</span><br><span style="color: hsl(120, 100%, 40%);">+                          if (remote)</span><br><span style="color: hsl(120, 100%, 40%);">+                                   freeaddrinfo(remote);</span><br><span style="color: hsl(120, 100%, 40%);">+                         LOGP(DLGLOBAL, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "Unable to find a common protocol (IPv4 or IPv6) "</span><br><span style="color: hsl(120, 100%, 40%);">+                                  "for local host: %s and remote host: %s.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                local_host, remote_host);</span><br><span style="color: hsl(120, 100%, 40%);">+                                return -ENODEV;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if ((flags & OSMO_SOCK_F_BIND)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  family = local_ipv6 ? AF_INET6 : AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if ((flags & OSMO_SOCK_F_CONNECT)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       family = remote_ipv6 ? AF_INET6 : AF_INET;</span><br><span>           }</span><br><span>    }</span><br><span> </span><br><span>diff --git a/tests/socket/socket_test.c b/tests/socket/socket_test.c</span><br><span>index 5cf20b7..ae77184 100644</span><br><span>--- a/tests/socket/socket_test.c</span><br><span>+++ b/tests/socket/socket_test.c</span><br><span>@@ -147,7 +147,7 @@</span><br><span>     printf("Checking osmo_sock_init2(AF_UNSPEC) BIND on IPv4\n");</span><br><span>      fd = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, "127.0.0.1", 0, NULL, 0,</span><br><span>                       OSMO_SOCK_F_BIND);</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(fd == -ENODEV); /* BUG! */</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(fd >= 0);</span><br><span> </span><br><span>         talloc_free(name);</span><br><span> </span><br><span>diff --git a/tests/socket/socket_test.err b/tests/socket/socket_test.err</span><br><span>index 37504e7..0f0f8da 100644</span><br><span>--- a/tests/socket/socket_test.err</span><br><span>+++ b/tests/socket/socket_test.err</span><br><span>@@ -2,4 +2,3 @@</span><br><span> invalid: you have to specify either BIND or CONNECT flags</span><br><span> Unable to find a common protocol (IPv4 or IPv6) for local host: 127.0.0.1 and remote host: ::1.</span><br><span> Unable to find a common protocol (IPv4 or IPv6) for local host: ::1 and remote host: 127.0.0.1.</span><br><span style="color: hsl(0, 100%, 40%);">-Unable to find a common protocol (IPv4 or IPv6) for local host: 127.0.0.1 and remote host: (null).</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/19919">change 19919</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/19919"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I59bf4b4b3ed14766a5a5285923d1ffa9fc8b2294 </div>
<div style="display:none"> Gerrit-Change-Number: 19919 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>