Loading include/linux/cgroup.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -621,6 +621,7 @@ struct cgroup_namespace { atomic_t count; atomic_t count; struct ns_common ns; struct ns_common ns; struct user_namespace *user_ns; struct user_namespace *user_ns; struct ucounts *ucounts; struct css_set *root_cset; struct css_set *root_cset; }; }; Loading include/linux/user_namespace.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ enum ucount_type { UCOUNT_PID_NAMESPACES, UCOUNT_PID_NAMESPACES, UCOUNT_UTS_NAMESPACES, UCOUNT_UTS_NAMESPACES, UCOUNT_IPC_NAMESPACES, UCOUNT_IPC_NAMESPACES, UCOUNT_CGROUP_NAMESPACES, UCOUNT_COUNTS, UCOUNT_COUNTS, }; }; Loading kernel/cgroup.c +18 −0 Original line number Original line Diff line number Diff line Loading @@ -6295,6 +6295,16 @@ void cgroup_sk_free(struct sock_cgroup_data *skcd) /* cgroup namespaces */ /* cgroup namespaces */ static struct ucounts *inc_cgroup_namespaces(struct user_namespace *ns) { return inc_ucount(ns, current_euid(), UCOUNT_CGROUP_NAMESPACES); } static void dec_cgroup_namespaces(struct ucounts *ucounts) { dec_ucount(ucounts, UCOUNT_CGROUP_NAMESPACES); } static struct cgroup_namespace *alloc_cgroup_ns(void) static struct cgroup_namespace *alloc_cgroup_ns(void) { { struct cgroup_namespace *new_ns; struct cgroup_namespace *new_ns; Loading @@ -6316,6 +6326,7 @@ static struct cgroup_namespace *alloc_cgroup_ns(void) void free_cgroup_ns(struct cgroup_namespace *ns) void free_cgroup_ns(struct cgroup_namespace *ns) { { put_css_set(ns->root_cset); put_css_set(ns->root_cset); dec_cgroup_namespaces(ns->ucounts); put_user_ns(ns->user_ns); put_user_ns(ns->user_ns); ns_free_inum(&ns->ns); ns_free_inum(&ns->ns); kfree(ns); kfree(ns); Loading @@ -6327,6 +6338,7 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags, struct cgroup_namespace *old_ns) struct cgroup_namespace *old_ns) { { struct cgroup_namespace *new_ns; struct cgroup_namespace *new_ns; struct ucounts *ucounts; struct css_set *cset; struct css_set *cset; BUG_ON(!old_ns); BUG_ON(!old_ns); Loading @@ -6340,6 +6352,10 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags, if (!ns_capable(user_ns, CAP_SYS_ADMIN)) if (!ns_capable(user_ns, CAP_SYS_ADMIN)) return ERR_PTR(-EPERM); return ERR_PTR(-EPERM); ucounts = inc_cgroup_namespaces(user_ns); if (!ucounts) return ERR_PTR(-ENFILE); /* It is not safe to take cgroup_mutex here */ /* It is not safe to take cgroup_mutex here */ spin_lock_irq(&css_set_lock); spin_lock_irq(&css_set_lock); cset = task_css_set(current); cset = task_css_set(current); Loading @@ -6349,10 +6365,12 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags, new_ns = alloc_cgroup_ns(); new_ns = alloc_cgroup_ns(); if (IS_ERR(new_ns)) { if (IS_ERR(new_ns)) { put_css_set(cset); put_css_set(cset); dec_cgroup_namespaces(ucounts); return new_ns; return new_ns; } } new_ns->user_ns = get_user_ns(user_ns); new_ns->user_ns = get_user_ns(user_ns); new_ns->ucounts = ucounts; new_ns->root_cset = cset; new_ns->root_cset = cset; return new_ns; return new_ns; Loading kernel/ucount.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -71,6 +71,7 @@ static struct ctl_table user_table[] = { UCOUNT_ENTRY("max_pid_namespaces"), UCOUNT_ENTRY("max_pid_namespaces"), UCOUNT_ENTRY("max_uts_namespaces"), UCOUNT_ENTRY("max_uts_namespaces"), UCOUNT_ENTRY("max_ipc_namespaces"), UCOUNT_ENTRY("max_ipc_namespaces"), UCOUNT_ENTRY("max_cgroup_namespaces"), { } { } }; }; #endif /* CONFIG_SYSCTL */ #endif /* CONFIG_SYSCTL */ Loading Loading
include/linux/cgroup.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -621,6 +621,7 @@ struct cgroup_namespace { atomic_t count; atomic_t count; struct ns_common ns; struct ns_common ns; struct user_namespace *user_ns; struct user_namespace *user_ns; struct ucounts *ucounts; struct css_set *root_cset; struct css_set *root_cset; }; }; Loading
include/linux/user_namespace.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ enum ucount_type { UCOUNT_PID_NAMESPACES, UCOUNT_PID_NAMESPACES, UCOUNT_UTS_NAMESPACES, UCOUNT_UTS_NAMESPACES, UCOUNT_IPC_NAMESPACES, UCOUNT_IPC_NAMESPACES, UCOUNT_CGROUP_NAMESPACES, UCOUNT_COUNTS, UCOUNT_COUNTS, }; }; Loading
kernel/cgroup.c +18 −0 Original line number Original line Diff line number Diff line Loading @@ -6295,6 +6295,16 @@ void cgroup_sk_free(struct sock_cgroup_data *skcd) /* cgroup namespaces */ /* cgroup namespaces */ static struct ucounts *inc_cgroup_namespaces(struct user_namespace *ns) { return inc_ucount(ns, current_euid(), UCOUNT_CGROUP_NAMESPACES); } static void dec_cgroup_namespaces(struct ucounts *ucounts) { dec_ucount(ucounts, UCOUNT_CGROUP_NAMESPACES); } static struct cgroup_namespace *alloc_cgroup_ns(void) static struct cgroup_namespace *alloc_cgroup_ns(void) { { struct cgroup_namespace *new_ns; struct cgroup_namespace *new_ns; Loading @@ -6316,6 +6326,7 @@ static struct cgroup_namespace *alloc_cgroup_ns(void) void free_cgroup_ns(struct cgroup_namespace *ns) void free_cgroup_ns(struct cgroup_namespace *ns) { { put_css_set(ns->root_cset); put_css_set(ns->root_cset); dec_cgroup_namespaces(ns->ucounts); put_user_ns(ns->user_ns); put_user_ns(ns->user_ns); ns_free_inum(&ns->ns); ns_free_inum(&ns->ns); kfree(ns); kfree(ns); Loading @@ -6327,6 +6338,7 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags, struct cgroup_namespace *old_ns) struct cgroup_namespace *old_ns) { { struct cgroup_namespace *new_ns; struct cgroup_namespace *new_ns; struct ucounts *ucounts; struct css_set *cset; struct css_set *cset; BUG_ON(!old_ns); BUG_ON(!old_ns); Loading @@ -6340,6 +6352,10 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags, if (!ns_capable(user_ns, CAP_SYS_ADMIN)) if (!ns_capable(user_ns, CAP_SYS_ADMIN)) return ERR_PTR(-EPERM); return ERR_PTR(-EPERM); ucounts = inc_cgroup_namespaces(user_ns); if (!ucounts) return ERR_PTR(-ENFILE); /* It is not safe to take cgroup_mutex here */ /* It is not safe to take cgroup_mutex here */ spin_lock_irq(&css_set_lock); spin_lock_irq(&css_set_lock); cset = task_css_set(current); cset = task_css_set(current); Loading @@ -6349,10 +6365,12 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags, new_ns = alloc_cgroup_ns(); new_ns = alloc_cgroup_ns(); if (IS_ERR(new_ns)) { if (IS_ERR(new_ns)) { put_css_set(cset); put_css_set(cset); dec_cgroup_namespaces(ucounts); return new_ns; return new_ns; } } new_ns->user_ns = get_user_ns(user_ns); new_ns->user_ns = get_user_ns(user_ns); new_ns->ucounts = ucounts; new_ns->root_cset = cset; new_ns->root_cset = cset; return new_ns; return new_ns; Loading
kernel/ucount.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -71,6 +71,7 @@ static struct ctl_table user_table[] = { UCOUNT_ENTRY("max_pid_namespaces"), UCOUNT_ENTRY("max_pid_namespaces"), UCOUNT_ENTRY("max_uts_namespaces"), UCOUNT_ENTRY("max_uts_namespaces"), UCOUNT_ENTRY("max_ipc_namespaces"), UCOUNT_ENTRY("max_ipc_namespaces"), UCOUNT_ENTRY("max_cgroup_namespaces"), { } { } }; }; #endif /* CONFIG_SYSCTL */ #endif /* CONFIG_SYSCTL */ Loading