diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2023-05-21 14:50:11 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2023-05-23 16:13:28 +0200 |
commit | b0e450aa8500648cc89ca4f68b6a6155267ccd9d (patch) | |
tree | de7d5fb94cdcfab8a6005c31c165d4d4a756b114 | |
parent | b0881aae6d91845821b2732f3fc8890e3d9ec4d2 (diff) | |
download | passt-b0e450aa8500648cc89ca4f68b6a6155267ccd9d.tar passt-b0e450aa8500648cc89ca4f68b6a6155267ccd9d.tar.gz passt-b0e450aa8500648cc89ca4f68b6a6155267ccd9d.tar.bz2 passt-b0e450aa8500648cc89ca4f68b6a6155267ccd9d.tar.lz passt-b0e450aa8500648cc89ca4f68b6a6155267ccd9d.tar.xz passt-b0e450aa8500648cc89ca4f68b6a6155267ccd9d.tar.zst passt-b0e450aa8500648cc89ca4f68b6a6155267ccd9d.zip |
pasta: Detach mount namespace, (re)mount procfs before spawning command
If we want /proc contents to be consistent after pasta spawns a child
process in a new PID namespace (only for operation without a
pre-existing namespace), we need to mount /proc after the clone(2)
call with CLONE_NEWPID, and we enable the child to do that by
passing, in the same call, the CLONE_NEWNS flag, as described by
pid_namespaces(7).
This is not really a remount: in fact, passing MS_REMOUNT to mount(2)
would make the call fail. We're in another mount namespace now, so
it's a fresh mount that has the effect of hiding the existing one.
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r-- | pasta.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -29,6 +29,7 @@ #include <syslog.h> #include <sys/epoll.h> #include <sys/inotify.h> +#include <sys/mount.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> @@ -172,6 +173,10 @@ static int pasta_spawn_cmd(void *arg) const struct pasta_spawn_cmd_arg *a; sigset_t set; + /* We run in a detached PID and mount namespace: mount /proc over */ + if (mount("", "/proc", "proc", 0, NULL)) + warn("Couldn't mount /proc: %s", strerror(errno)); + if (write_file("/proc/sys/net/ipv4/ping_group_range", "0 0")) warn("Cannot set ping_group_range, ICMP requests might fail"); @@ -243,7 +248,7 @@ void pasta_start_ns(struct ctx *c, uid_t uid, gid_t gid, pasta_child_pid = do_clone(pasta_spawn_cmd, ns_fn_stack, sizeof(ns_fn_stack), CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNET | - CLONE_NEWUTS | SIGCHLD, + CLONE_NEWUTS | CLONE_NEWNS | SIGCHLD, (void *)&arg); if (pasta_child_pid == -1) { |