start: resolve clone flags

parent abeb5bba
...@@ -2194,6 +2194,12 @@ static int set_config_namespace_clone(const char *key, const char *value, ...@@ -2194,6 +2194,12 @@ static int set_config_namespace_clone(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_namespace_clone(key, lxc_conf, data); return clr_config_namespace_clone(key, lxc_conf, data);
if (lxc_conf->ns_keep != 0) {
ERROR("%s - Cannot set both \"lxc.namespace.clone\" and "
"\"lxc.namespace.keep\"", strerror(EINVAL));
return -EINVAL;
}
ns = strdup(value); ns = strdup(value);
if (!ns) if (!ns)
return -1; return -1;
...@@ -2224,6 +2230,12 @@ static int set_config_namespace_keep(const char *key, const char *value, ...@@ -2224,6 +2230,12 @@ static int set_config_namespace_keep(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_namespace_keep(key, lxc_conf, data); return clr_config_namespace_keep(key, lxc_conf, data);
if (lxc_conf->ns_clone != 0) {
ERROR("%s - Cannot set both \"lxc.namespace.clone\" and "
"\"lxc.namespace.keep\"", strerror(EINVAL));
return -EINVAL;
}
ns = strdup(value); ns = strdup(value);
if (!ns) if (!ns)
return -1; return -1;
......
...@@ -1338,44 +1338,31 @@ static int lxc_recv_ttys_from_child(struct lxc_handler *handler) ...@@ -1338,44 +1338,31 @@ static int lxc_recv_ttys_from_child(struct lxc_handler *handler)
int resolve_clone_flags(struct lxc_handler *handler) int resolve_clone_flags(struct lxc_handler *handler)
{ {
handler->clone_flags = CLONE_NEWNS; int i;
struct lxc_conf *conf = handler->conf;
if (!handler->conf->ns_share[LXC_NS_USER]) {
if (!lxc_list_empty(&handler->conf->id_map))
handler->clone_flags |= CLONE_NEWUSER;
} else {
INFO("Inheriting user namespace");
}
if (!handler->conf->ns_share[LXC_NS_NET]) { for (i = 0; i < LXC_NS_MAX; i++) {
if (!lxc_requests_empty_network(handler)) if (conf->ns_keep != 0) {
handler->clone_flags |= CLONE_NEWNET; if ((conf->ns_keep & ns_info[i].clone_flag) == 0)
} else { handler->clone_flags |= ns_info[i].clone_flag;
INFO("Inheriting net namespace"); } else if (conf->ns_clone != 0) {
} if ((conf->ns_clone & ns_info[i].clone_flag) > 0)
handler->clone_flags |= ns_info[i].clone_flag;
} else {
if (i == LXC_NS_USER && lxc_list_empty(&handler->conf->id_map))
continue;
if (!handler->conf->ns_share[LXC_NS_IPC]) if (i == LXC_NS_NET && lxc_requests_empty_network(handler))
handler->clone_flags |= CLONE_NEWIPC; continue;
else
INFO("Inheriting ipc namespace");
if (!handler->conf->ns_share[LXC_NS_UTS]) handler->clone_flags |= ns_info[i].clone_flag;
handler->clone_flags |= CLONE_NEWUTS; }
else
INFO("Inheriting uts namespace");
if (!handler->conf->ns_share[LXC_NS_PID]) if (!conf->ns_share[i])
handler->clone_flags |= CLONE_NEWPID; continue;
else
INFO("Inheriting pid namespace");
if (cgns_supported()) { handler->clone_flags &= ~ns_info[i].clone_flag;
if (!handler->conf->ns_share[LXC_NS_CGROUP]) TRACE("Sharing %s namespace", ns_info[i].proc_name);
handler->clone_flags |= CLONE_NEWCGROUP;
else
INFO("Inheriting cgroup namespace");
} else if (handler->conf->ns_share[LXC_NS_CGROUP]) {
return -EINVAL;
} }
return 0; return 0;
...@@ -1567,7 +1554,8 @@ static int lxc_spawn(struct lxc_handler *handler) ...@@ -1567,7 +1554,8 @@ static int lxc_spawn(struct lxc_handler *handler)
* again. * again.
*/ */
if (wants_to_map_ids) { if (wants_to_map_ids) {
if (!handler->conf->ns_share[LXC_NS_USER]) { if (!handler->conf->ns_share[LXC_NS_USER] ||
(handler->conf->ns_keep & CLONE_NEWUSER) > 0) {
ret = lxc_map_ids(id_map, handler->pid); ret = lxc_map_ids(id_map, handler->pid);
if (ret < 0) { if (ret < 0) {
ERROR("Failed to set up id mapping."); ERROR("Failed to set up id mapping.");
......
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