Change in osmo-ggsn[master]: netns: Improve error checking

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Tue Feb 25 11:18:40 UTC 2020


pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/17254 )


Change subject: netns: Improve error checking
......................................................................

netns: Improve error checking

Change-Id: I9b9c8fd6eeaaa7d190b8e2a34ca82088904c7708
---
M lib/netns.c
M lib/netns.h
M sgsnemu/sgsnemu.c
3 files changed, 52 insertions(+), 20 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/54/17254/1

diff --git a/lib/netns.c b/lib/netns.c
index 6734b5d..442c23c 100644
--- a/lib/netns.c
+++ b/lib/netns.c
@@ -56,11 +56,13 @@
 	return setns(nsfd, CLONE_NEWNET);
 }
 
-void restore_ns(sigset_t *oldmask)
+int restore_ns(sigset_t *oldmask)
 {
-	setns(default_nsfd, CLONE_NEWNET);
+	int rc;
+	if ((rc = setns(default_nsfd, CLONE_NEWNET)) < 0)
+		return rc;
 
-	sigprocmask(SIG_SETMASK, oldmask, NULL);
+	return sigprocmask(SIG_SETMASK, oldmask, NULL);
 }
 
 int open_ns(int nsfd, const char *pathname, int flags)
@@ -103,12 +105,11 @@
 	return sk;
 }
 
-void init_netns()
+int init_netns()
 {
-	if ((default_nsfd = open("/proc/self/ns/net", O_RDONLY)) < 0) {
-		perror("init_netns");
-		exit(EXIT_FAILURE);
-	}
+	if ((default_nsfd = open("/proc/self/ns/net", O_RDONLY)) < 0)
+		return default_nsfd;
+	return 0;
 }
 
 int get_nsfd(const char *name)
@@ -137,7 +138,8 @@
 	unshare(CLONE_NEWNET);
 	mount("/proc/self/ns/net", path, "none", MS_BIND, NULL);
 
-	setns(default_nsfd, CLONE_NEWNET);
+	if ((r = setns(default_nsfd, CLONE_NEWNET)) < 0)
+		return r;
 
 	sigprocmask(SIG_SETMASK, &oldmask, NULL);
 
diff --git a/lib/netns.h b/lib/netns.h
index 168e44f..3b91ba3 100644
--- a/lib/netns.h
+++ b/lib/netns.h
@@ -21,10 +21,10 @@
 
 #if defined(__linux__)
 
-void init_netns(void);
+int init_netns(void);
 
 int switch_ns(int nsfd, sigset_t *oldmask);
-void restore_ns(sigset_t *oldmask);
+int restore_ns(sigset_t *oldmask);
 
 int open_ns(int nsfd, const char *pathname, int flags);
 int socket_ns(int nsfd, int domain, int type, int protocol);
diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c
index 2c0ce1b..f105d0a 100644
--- a/sgsnemu/sgsnemu.c
+++ b/sgsnemu/sgsnemu.c
@@ -1328,14 +1328,22 @@
 		sigset_t oldmask;
 
 		if ((options.netns)) {
-			switch_ns(netns, &oldmask);
+			if (switch_ns(netns, &oldmask) < 0) {
+				SYS_ERR(DSGSN, LOGL_ERROR, 0,
+					"Failed to switch to netns %s: %s\n",
+					options.netns, strerror(errno));
+			}
 		}
 #endif
 		tun_runscript(tun, options.ipdown);
 
 #if defined(__linux__)
 		if ((options.netns)) {
-			restore_ns(&oldmask);
+			if (restore_ns(&oldmask) < 0) {
+				SYS_ERR(DSGSN, LOGL_ERROR, 0,
+					"Failed to switch to original netns: %s\n",
+					strerror(errno));
+			}
 		}
 #endif
 	}
@@ -1458,7 +1466,11 @@
 
 #if defined(__linux__)
 	if ((options.createif) && (options.netns)) {
-		switch_ns(netns, &oldmask);
+		if (switch_ns(netns, &oldmask) < 0) {
+			SYS_ERR(DSGSN, LOGL_ERROR, 0,
+				"Failed to switch to netns %s: %s\n",
+				options.netns, strerror(errno));
+		}
 	}
 #endif
 
@@ -1504,7 +1516,10 @@
 
 #if defined(__linux__)
 	if ((options.createif) && (options.netns)) {
-		restore_ns(&oldmask);
+		if (restore_ns(&oldmask) < 0) {
+			SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to switch to original netns: %s\n",
+				strerror(errno));
+		}
 	}
 #endif
 
@@ -1572,7 +1587,7 @@
 	fd_set fds;		/* For select() */
 	struct timeval idleTime;	/* How long to select() */
 	struct pdp_t *pdp;
-	int n;
+	int n, rc;
 	int starttime = time(NULL);	/* Time program was started */
 	int stoptime = 0;	/* Time to exit */
 	int pingtimeout = 0;	/* Time to print ping statistics */
@@ -1594,7 +1609,10 @@
 	osmo_init_logging2(tall_sgsnemu_ctx, &log_info);
 
 #if defined(__linux__)
-	init_netns();
+	if ((rc = init_netns()) < 0) {
+		SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to initialize netns: %s", strerror(errno));
+		exit(1);
+	}
 #endif
 
 	/* Process options given in configuration file and command line */
@@ -1622,8 +1640,16 @@
 
 #if defined(__linux__)
 	if ((options.createif) && (options.netns)) {
-		netns = get_nsfd(options.netns);
-		switch_ns(netns, &oldmask);
+		if ((netns = get_nsfd(options.netns)) < 0) {
+			SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to obtain fd for netns %s: %s\n",
+				options.netns, strerror(errno));
+			exit(1);
+		}
+		if (switch_ns(netns, &oldmask) < 0) {
+			SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to switch to netns %s: %s\n",
+				options.netns, strerror(errno));
+			exit(1);
+		}
 	}
 #endif
 
@@ -1654,7 +1680,11 @@
 
 #if defined(__linux__)
 	if ((options.createif) && (options.netns)) {
-		restore_ns(&oldmask);
+		if ((rc = restore_ns(&oldmask)) < 0) {
+			SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to switch to original netns: %s\n",
+				strerror(errno));
+			exit(1);
+		}
 	}
 #endif
 

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/17254
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: I9b9c8fd6eeaaa7d190b8e2a34ca82088904c7708
Gerrit-Change-Number: 17254
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200225/3aff348a/attachment.htm>


More information about the gerrit-log mailing list