Commit 5b1e83cb by Serge Hallyn

Unshare netns after setting the userns mappings

so that there is a root uid mapping for the /proc/net files. Signed-off-by: 's avatarSerge Hallyn <serge.hallyn@ubuntu.com>
parent fc5bc4a6
...@@ -736,6 +736,20 @@ static int do_start(void *data) ...@@ -736,6 +736,20 @@ static int do_start(void *data)
close(handler->pinfd); close(handler->pinfd);
} }
if (lxc_sync_wait_parent(handler, LXC_SYNC_STARTUP))
return -1;
/* Unshare CLONE_NEWNET after CLONE_NEWUSER - see
https://github.com/lxc/lxd/issues/1978 */
if ((handler->clone_flags & (CLONE_NEWNET | CLONE_NEWUSER)) ==
(CLONE_NEWNET | CLONE_NEWUSER)) {
ret = unshare(CLONE_NEWNET);
if (ret < 0) {
SYSERROR("Error unsharing network namespace");
goto out_warn_father;
}
}
/* Tell the parent task it can begin to configure the /* Tell the parent task it can begin to configure the
* container and wait for it to finish * container and wait for it to finish
*/ */
...@@ -1027,7 +1041,7 @@ static int lxc_spawn(struct lxc_handler *handler) ...@@ -1027,7 +1041,7 @@ static int lxc_spawn(struct lxc_handler *handler)
char *errmsg = NULL; char *errmsg = NULL;
bool cgroups_connected = false; bool cgroups_connected = false;
int saved_ns_fd[LXC_NS_MAX]; int saved_ns_fd[LXC_NS_MAX];
int preserve_mask = 0, i; int preserve_mask = 0, i, flags;
int netpipepair[2], nveths; int netpipepair[2], nveths;
netpipe = -1; netpipe = -1;
...@@ -1118,6 +1132,9 @@ static int lxc_spawn(struct lxc_handler *handler) ...@@ -1118,6 +1132,9 @@ static int lxc_spawn(struct lxc_handler *handler)
} }
/* Create a process in a new set of namespaces */ /* Create a process in a new set of namespaces */
flags = handler->clone_flags;
if (handler->clone_flags & CLONE_NEWUSER)
flags &= ~CLONE_NEWNET;
handler->pid = lxc_clone(do_start, handler, handler->clone_flags); handler->pid = lxc_clone(do_start, handler, handler->clone_flags);
if (handler->pid < 0) { if (handler->pid < 0) {
SYSERROR("failed to fork into a new namespace"); SYSERROR("failed to fork into a new namespace");
...@@ -1135,8 +1152,25 @@ static int lxc_spawn(struct lxc_handler *handler) ...@@ -1135,8 +1152,25 @@ static int lxc_spawn(struct lxc_handler *handler)
lxc_sync_fini_child(handler); lxc_sync_fini_child(handler);
if (lxc_sync_wait_child(handler, LXC_SYNC_CONFIGURE)) /* map the container uids - the container became an invalid
* userid the moment it was cloned with CLONE_NEWUSER - this
* call doesn't change anything immediately, but allows the
* container to setuid(0) (0 being mapped to something else on
* the host) later to become a valid uid again */
if (lxc_map_ids(&handler->conf->id_map, handler->pid)) {
ERROR("failed to set up id mapping");
goto out_delete_net;
}
if (lxc_sync_wake_child(handler, LXC_SYNC_STARTUP)) {
failed_before_rename = 1; failed_before_rename = 1;
goto out_delete_net;
}
if (lxc_sync_wait_child(handler, LXC_SYNC_CONFIGURE)) {
failed_before_rename = 1;
goto out_delete_net;
}
if (!cgroup_create_legacy(handler)) { if (!cgroup_create_legacy(handler)) {
ERROR("failed to setup the legacy cgroups for %s", name); ERROR("failed to setup the legacy cgroups for %s", name);
...@@ -1182,16 +1216,6 @@ static int lxc_spawn(struct lxc_handler *handler) ...@@ -1182,16 +1216,6 @@ static int lxc_spawn(struct lxc_handler *handler)
close(netpipepair[1]); close(netpipepair[1]);
} }
/* map the container uids - the container became an invalid
* userid the moment it was cloned with CLONE_NEWUSER - this
* call doesn't change anything immediately, but allows the
* container to setuid(0) (0 being mapped to something else on
* the host) later to become a valid uid again */
if (lxc_map_ids(&handler->conf->id_map, handler->pid)) {
ERROR("failed to set up id mapping");
goto out_delete_net;
}
/* Tell the child to continue its initialization. we'll get /* Tell the child to continue its initialization. we'll get
* LXC_SYNC_CGROUP when it is ready for us to setup cgroups * LXC_SYNC_CGROUP when it is ready for us to setup cgroups
*/ */
......
...@@ -99,6 +99,11 @@ int lxc_sync_wake_parent(struct lxc_handler *handler, int sequence) ...@@ -99,6 +99,11 @@ int lxc_sync_wake_parent(struct lxc_handler *handler, int sequence)
return __sync_wake(handler->sv[0], sequence); return __sync_wake(handler->sv[0], sequence);
} }
int lxc_sync_wait_parent(struct lxc_handler *handler, int sequence)
{
return __sync_wait(handler->sv[0], sequence);
}
int lxc_sync_wait_child(struct lxc_handler *handler, int sequence) int lxc_sync_wait_child(struct lxc_handler *handler, int sequence)
{ {
return __sync_wait(handler->sv[1], sequence); return __sync_wait(handler->sv[1], sequence);
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
struct lxc_handler; struct lxc_handler;
enum { enum {
LXC_SYNC_STARTUP,
LXC_SYNC_CONFIGURE, LXC_SYNC_CONFIGURE,
LXC_SYNC_POST_CONFIGURE, LXC_SYNC_POST_CONFIGURE,
LXC_SYNC_CGROUP, LXC_SYNC_CGROUP,
...@@ -42,6 +43,7 @@ void lxc_sync_fini_child(struct lxc_handler *); ...@@ -42,6 +43,7 @@ void lxc_sync_fini_child(struct lxc_handler *);
int lxc_sync_wake_child(struct lxc_handler *, int); int lxc_sync_wake_child(struct lxc_handler *, int);
int lxc_sync_wait_child(struct lxc_handler *, int); int lxc_sync_wait_child(struct lxc_handler *, int);
int lxc_sync_wake_parent(struct lxc_handler *, int); int lxc_sync_wake_parent(struct lxc_handler *, int);
int lxc_sync_wait_parent(struct lxc_handler *, int);
int lxc_sync_barrier_parent(struct lxc_handler *, int); int lxc_sync_barrier_parent(struct lxc_handler *, int);
int lxc_sync_barrier_child(struct lxc_handler *, int); int lxc_sync_barrier_child(struct lxc_handler *, int);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment