<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ggsn/+/17254">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">netns: Improve error checking<br><br>Change-Id: I9b9c8fd6eeaaa7d190b8e2a34ca82088904c7708<br>---<br>M lib/netns.c<br>M lib/netns.h<br>M sgsnemu/sgsnemu.c<br>3 files changed, 52 insertions(+), 20 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/54/17254/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/lib/netns.c b/lib/netns.c</span><br><span>index 6734b5d..442c23c 100644</span><br><span>--- a/lib/netns.c</span><br><span>+++ b/lib/netns.c</span><br><span>@@ -56,11 +56,13 @@</span><br><span>         return setns(nsfd, CLONE_NEWNET);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void restore_ns(sigset_t *oldmask)</span><br><span style="color: hsl(120, 100%, 40%);">+int restore_ns(sigset_t *oldmask)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    setns(default_nsfd, CLONE_NEWNET);</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       if ((rc = setns(default_nsfd, CLONE_NEWNET)) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          return rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  sigprocmask(SIG_SETMASK, oldmask, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      return sigprocmask(SIG_SETMASK, oldmask, NULL);</span><br><span> }</span><br><span> </span><br><span> int open_ns(int nsfd, const char *pathname, int flags)</span><br><span>@@ -103,12 +105,11 @@</span><br><span>   return sk;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void init_netns()</span><br><span style="color: hsl(120, 100%, 40%);">+int init_netns()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     if ((default_nsfd = open("/proc/self/ns/net", O_RDONLY)) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            perror("init_netns");</span><br><span style="color: hsl(0, 100%, 40%);">-         exit(EXIT_FAILURE);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if ((default_nsfd = open("/proc/self/ns/net", O_RDONLY)) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            return default_nsfd;</span><br><span style="color: hsl(120, 100%, 40%);">+  return 0;</span><br><span> }</span><br><span> </span><br><span> int get_nsfd(const char *name)</span><br><span>@@ -137,7 +138,8 @@</span><br><span>   unshare(CLONE_NEWNET);</span><br><span>       mount("/proc/self/ns/net", path, "none", MS_BIND, NULL);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        setns(default_nsfd, CLONE_NEWNET);</span><br><span style="color: hsl(120, 100%, 40%);">+    if ((r = setns(default_nsfd, CLONE_NEWNET)) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return r;</span><br><span> </span><br><span>        sigprocmask(SIG_SETMASK, &oldmask, NULL);</span><br><span> </span><br><span>diff --git a/lib/netns.h b/lib/netns.h</span><br><span>index 168e44f..3b91ba3 100644</span><br><span>--- a/lib/netns.h</span><br><span>+++ b/lib/netns.h</span><br><span>@@ -21,10 +21,10 @@</span><br><span> </span><br><span> #if defined(__linux__)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void init_netns(void);</span><br><span style="color: hsl(120, 100%, 40%);">+int init_netns(void);</span><br><span> </span><br><span> int switch_ns(int nsfd, sigset_t *oldmask);</span><br><span style="color: hsl(0, 100%, 40%);">-void restore_ns(sigset_t *oldmask);</span><br><span style="color: hsl(120, 100%, 40%);">+int restore_ns(sigset_t *oldmask);</span><br><span> </span><br><span> int open_ns(int nsfd, const char *pathname, int flags);</span><br><span> int socket_ns(int nsfd, int domain, int type, int protocol);</span><br><span>diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c</span><br><span>index 2c0ce1b..f105d0a 100644</span><br><span>--- a/sgsnemu/sgsnemu.c</span><br><span>+++ b/sgsnemu/sgsnemu.c</span><br><span>@@ -1328,14 +1328,22 @@</span><br><span>          sigset_t oldmask;</span><br><span> </span><br><span>                if ((options.netns)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  switch_ns(netns, &oldmask);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (switch_ns(netns, &oldmask) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          SYS_ERR(DSGSN, LOGL_ERROR, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "Failed to switch to netns %s: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                       options.netns, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span>            }</span><br><span> #endif</span><br><span>          tun_runscript(tun, options.ipdown);</span><br><span> </span><br><span> #if defined(__linux__)</span><br><span>            if ((options.netns)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  restore_ns(&oldmask);</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (restore_ns(&oldmask) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                SYS_ERR(DSGSN, LOGL_ERROR, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "Failed to switch to original netns: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span>            }</span><br><span> #endif</span><br><span>  }</span><br><span>@@ -1458,7 +1466,11 @@</span><br><span> </span><br><span> #if defined(__linux__)</span><br><span>     if ((options.createif) && (options.netns)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            switch_ns(netns, &oldmask);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (switch_ns(netns, &oldmask) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  SYS_ERR(DSGSN, LOGL_ERROR, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                         "Failed to switch to netns %s: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                               options.netns, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span>    }</span><br><span> #endif</span><br><span> </span><br><span>@@ -1504,7 +1516,10 @@</span><br><span> </span><br><span> #if defined(__linux__)</span><br><span>       if ((options.createif) && (options.netns)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            restore_ns(&oldmask);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (restore_ns(&oldmask) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to switch to original netns: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>    }</span><br><span> #endif</span><br><span> </span><br><span>@@ -1572,7 +1587,7 @@</span><br><span>      fd_set fds;             /* For select() */</span><br><span>   struct timeval idleTime;        /* How long to select() */</span><br><span>   struct pdp_t *pdp;</span><br><span style="color: hsl(0, 100%, 40%);">-      int n;</span><br><span style="color: hsl(120, 100%, 40%);">+        int n, rc;</span><br><span>   int starttime = time(NULL);     /* Time program was started */</span><br><span>       int stoptime = 0;       /* Time to exit */</span><br><span>   int pingtimeout = 0;    /* Time to print ping statistics */</span><br><span>@@ -1594,7 +1609,10 @@</span><br><span>         osmo_init_logging2(tall_sgsnemu_ctx, &log_info);</span><br><span> </span><br><span> #if defined(__linux__)</span><br><span style="color: hsl(0, 100%, 40%);">-      init_netns();</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((rc = init_netns()) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to initialize netns: %s", strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+           exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span> #endif</span><br><span> </span><br><span>      /* Process options given in configuration file and command line */</span><br><span>@@ -1622,8 +1640,16 @@</span><br><span> </span><br><span> #if defined(__linux__)</span><br><span>    if ((options.createif) && (options.netns)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            netns = get_nsfd(options.netns);</span><br><span style="color: hsl(0, 100%, 40%);">-                switch_ns(netns, &oldmask);</span><br><span style="color: hsl(120, 100%, 40%);">+               if ((netns = get_nsfd(options.netns)) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to obtain fd for netns %s: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                             options.netns, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+                      exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (switch_ns(netns, &oldmask) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to switch to netns %s: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                         options.netns, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+                      exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span>    }</span><br><span> #endif</span><br><span> </span><br><span>@@ -1654,7 +1680,11 @@</span><br><span> </span><br><span> #if defined(__linux__)</span><br><span>       if ((options.createif) && (options.netns)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            restore_ns(&oldmask);</span><br><span style="color: hsl(120, 100%, 40%);">+             if ((rc = restore_ns(&oldmask)) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to switch to original netns: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+                     exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span>    }</span><br><span> #endif</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ggsn/+/17254">change 17254</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/osmo-ggsn/+/17254"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ggsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I9b9c8fd6eeaaa7d190b8e2a34ca82088904c7708 </div>
<div style="display:none"> Gerrit-Change-Number: 17254 </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>