Unverified Commit 71558435 by Serge Hallyn Committed by GitHub

Merge pull request #2057 from brauner/2017-12-22/bugfixes

start: simplify cgroup namespace preservation
parents 15090139 8bf3abfb
...@@ -868,7 +868,7 @@ void lxc_abort(const char *name, struct lxc_handler *handler) ...@@ -868,7 +868,7 @@ void lxc_abort(const char *name, struct lxc_handler *handler)
static int do_start(void *data) static int do_start(void *data)
{ {
int fd, ret; int ret;
struct lxc_list *iterator; struct lxc_list *iterator;
char path[PATH_MAX]; char path[PATH_MAX];
struct lxc_handler *handler = data; struct lxc_handler *handler = data;
...@@ -930,14 +930,22 @@ static int do_start(void *data) ...@@ -930,14 +930,22 @@ static int do_start(void *data)
* privilege over our namespace. * privilege over our namespace.
*/ */
if (!lxc_list_empty(&handler->conf->id_map)) { if (!lxc_list_empty(&handler->conf->id_map)) {
if (lxc_switch_uid_gid(0, 0) < 0) ret = lxc_switch_uid_gid(0, 0);
if (ret < 0)
goto out_warn_father; goto out_warn_father;
/* Drop groups only after we switched to a valid gid in the new /* Drop groups only after we switched to a valid gid in the new
* user namespace. * user namespace.
*/ */
if (lxc_setgroups(0, NULL) < 0) ret = lxc_setgroups(0, NULL);
if (ret < 0)
goto out_warn_father; goto out_warn_father;
if (!handler->am_root) {
ret = prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
if (ret < 0)
goto out_warn_father;
}
} }
if (access(handler->lxcpath, X_OK)) { if (access(handler->lxcpath, X_OK)) {
...@@ -1006,30 +1014,12 @@ static int do_start(void *data) ...@@ -1006,30 +1014,12 @@ static int do_start(void *data)
/* Setup the container, ip, names, utsname, ... */ /* Setup the container, ip, names, utsname, ... */
ret = lxc_setup(handler); ret = lxc_setup(handler);
close(handler->data_sock[1]); close(handler->data_sock[1]);
close(handler->data_sock[0]);
if (ret < 0) { if (ret < 0) {
ERROR("Failed to setup container \"%s\".", handler->name); ERROR("Failed to setup container \"%s\".", handler->name);
close(handler->data_sock[0]);
goto out_warn_father; goto out_warn_father;
} }
if (handler->clone_flags & CLONE_NEWCGROUP) {
fd = lxc_preserve_ns(lxc_raw_getpid(), "cgroup");
if (fd < 0) {
ERROR("%s - Failed to preserve cgroup namespace", strerror(errno));
close(handler->data_sock[0]);
goto out_warn_father;
}
ret = lxc_abstract_unix_send_fds(handler->data_sock[0], &fd, 1, NULL, 0);
close(fd);
if (ret < 0) {
ERROR("%s - Failed to preserve cgroup namespace", strerror(errno));
close(handler->data_sock[0]);
goto out_warn_father;
}
}
close(handler->data_sock[0]);
/* Set the label to change to when we exec(2) the container's init. */ /* Set the label to change to when we exec(2) the container's init. */
if (lsm_process_label_set(NULL, handler->conf, 1, 1) < 0) if (lsm_process_label_set(NULL, handler->conf, 1, 1) < 0)
goto out_warn_father; goto out_warn_father;
...@@ -1434,7 +1424,7 @@ static int lxc_spawn(struct lxc_handler *handler) ...@@ -1434,7 +1424,7 @@ static int lxc_spawn(struct lxc_handler *handler)
if (handler->on_clone_flags & ns_info[i].clone_flag) if (handler->on_clone_flags & ns_info[i].clone_flag)
INFO("Cloned %s", ns_info[i].flag_name); INFO("Cloned %s", ns_info[i].flag_name);
if (!preserve_ns(handler->nsfd, handler->clone_flags & ~CLONE_NEWNET, handler->pid)) { if (!preserve_ns(handler->nsfd, handler->on_clone_flags, handler->pid)) {
ERROR("Failed to preserve cloned namespaces for lxc.hook.stop"); ERROR("Failed to preserve cloned namespaces for lxc.hook.stop");
goto out_delete_net; goto out_delete_net;
} }
...@@ -1539,6 +1529,17 @@ static int lxc_spawn(struct lxc_handler *handler) ...@@ -1539,6 +1529,17 @@ static int lxc_spawn(struct lxc_handler *handler)
cgroup_disconnect(); cgroup_disconnect();
cgroups_connected = false; cgroups_connected = false;
if (handler->clone_flags & CLONE_NEWCGROUP) {
/* Now we're ready to preserve the cgroup namespace */
ret = lxc_preserve_ns(handler->pid, "cgroup");
if (ret < 0) {
ERROR("%s - Failed to preserve cgroup namespace", strerror(errno));
goto out_delete_net;
}
handler->nsfd[LXC_NS_CGROUP] = ret;
DEBUG("Preserved cgroup namespace via fd %d", ret);
}
snprintf(pidstr, 20, "%d", handler->pid); snprintf(pidstr, 20, "%d", handler->pid);
if (setenv("LXC_PID", pidstr, 1)) if (setenv("LXC_PID", pidstr, 1))
SYSERROR("Failed to set environment variable: LXC_PID=%s.", pidstr); SYSERROR("Failed to set environment variable: LXC_PID=%s.", pidstr);
...@@ -1577,17 +1578,6 @@ static int lxc_spawn(struct lxc_handler *handler) ...@@ -1577,17 +1578,6 @@ static int lxc_spawn(struct lxc_handler *handler)
goto out_delete_net; goto out_delete_net;
} }
if (handler->clone_flags & CLONE_NEWCGROUP) {
ret = lxc_abstract_unix_recv_fds(handler->data_sock[1],
&handler->nsfd[LXC_NS_CGROUP],
1, NULL, 0);
if (ret < 0) {
ERROR("%s - Failed to preserve cgroup namespace", strerror(errno));
goto out_delete_net;
}
DEBUG("Preserved cgroup namespace via fd %d", handler->nsfd[LXC_NS_CGROUP]);
}
if (handler->ops->post_start(handler, handler->data)) if (handler->ops->post_start(handler, handler->data))
goto out_abort; goto out_abort;
......
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