aboutgitcodebugslistschat
path: root/pasta.c
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2023-05-14 13:32:41 +0200
committerStefano Brivio <sbrivio@redhat.com>2023-05-23 16:13:28 +0200
commitf099afb1f2f0a15eb0209a9893a5a23455939e71 (patch)
tree9ce6a4859fbf9d38242b4dfc36a8a459dffb837d /pasta.c
parent1c3c68970e34b895b6ec52b2144d0382b3bf640b (diff)
downloadpasst-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.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/pasta.c b/pasta.c
index b30ce70..1ebc868 100644
--- a/pasta.c
+++ b/pasta.c
@@ -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");
}
/**