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>
This commit is contained in:
parent
b0881aae6d
commit
b0e450aa85
1 changed files with 6 additions and 1 deletions
7
pasta.c
7
pasta.c
|
@ -29,6 +29,7 @@
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
#include <sys/epoll.h>
|
#include <sys/epoll.h>
|
||||||
#include <sys/inotify.h>
|
#include <sys/inotify.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -172,6 +173,10 @@ static int pasta_spawn_cmd(void *arg)
|
||||||
const struct pasta_spawn_cmd_arg *a;
|
const struct pasta_spawn_cmd_arg *a;
|
||||||
sigset_t set;
|
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"))
|
if (write_file("/proc/sys/net/ipv4/ping_group_range", "0 0"))
|
||||||
warn("Cannot set ping_group_range, ICMP requests might fail");
|
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,
|
pasta_child_pid = do_clone(pasta_spawn_cmd, ns_fn_stack,
|
||||||
sizeof(ns_fn_stack),
|
sizeof(ns_fn_stack),
|
||||||
CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNET |
|
CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNET |
|
||||||
CLONE_NEWUTS | SIGCHLD,
|
CLONE_NEWUTS | CLONE_NEWNS | SIGCHLD,
|
||||||
(void *)&arg);
|
(void *)&arg);
|
||||||
|
|
||||||
if (pasta_child_pid == -1) {
|
if (pasta_child_pid == -1) {
|
||||||
|
|
Loading…
Reference in a new issue