diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2023-05-14 13:32:41 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2023-05-23 16:13:28 +0200 |
commit | f099afb1f2f0a15eb0209a9893a5a23455939e71 (patch) | |
tree | 9ce6a4859fbf9d38242b4dfc36a8a459dffb837d /pasta.c | |
parent | 1c3c68970e34b895b6ec52b2144d0382b3bf640b (diff) | |
download | passt-f099afb1f2f0a15eb0209a9893a5a23455939e71.tar passt-f099afb1f2f0a15eb0209a9893a5a23455939e71.tar.gz passt-f099afb1f2f0a15eb0209a9893a5a23455939e71.tar.bz2 passt-f099afb1f2f0a15eb0209a9893a5a23455939e71.tar.lz passt-f099afb1f2f0a15eb0209a9893a5a23455939e71.tar.xz passt-f099afb1f2f0a15eb0209a9893a5a23455939e71.tar.zst passt-f099afb1f2f0a15eb0209a9893a5a23455939e71.zip |
pasta: Improve error handling on failure to join network namespace
In pasta_wait_for_ns(), open() failing with ENOENT is expected: we're
busy-looping until the network namespace appears. But any other
failure is not something we're going to recover from: return right
away if we don't get either success or ENOENT.
Now that pasta_wait_for_ns() can actually fail, handle that in
pasta_start_ns() by reporting the issue and exiting.
Looping on EPERM, when pasta doesn't actually have the permissions to
join a given namespace, isn't exactly a productive thing to do.
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'pasta.c')
-rw-r--r-- | pasta.c | 13 |
1 files changed, 9 insertions, 4 deletions
@@ -95,10 +95,13 @@ static int pasta_wait_for_ns(void *arg) char ns[PATH_MAX]; snprintf(ns, PATH_MAX, "/proc/%i/ns/net", pasta_child_pid); - do - while ((c->pasta_netns_fd = open(ns, flags)) < 0); - while (setns(c->pasta_netns_fd, CLONE_NEWNET) && - !close(c->pasta_netns_fd)); + do { + while ((c->pasta_netns_fd = open(ns, flags)) < 0) { + if (errno != ENOENT) + return 0; + } + } while (setns(c->pasta_netns_fd, CLONE_NEWNET) && + !close(c->pasta_netns_fd)); return 0; } @@ -257,6 +260,8 @@ void pasta_start_ns(struct ctx *c, uid_t uid, gid_t gid, } NS_CALL(pasta_wait_for_ns, c); + if (c->pasta_netns_fd < 0) + die("Failed to join network namespace"); } /** |