diff options
Diffstat (limited to 'kernel/sched/core.c')
| -rw-r--r-- | kernel/sched/core.c | 18 | 
1 files changed, 18 insertions, 0 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 5b582cabd31..014040fa3d2 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -7716,6 +7716,23 @@ static void cpu_cgroup_css_offline(struct cgroup *cgrp)  	sched_offline_group(tg);  } +static int +cpu_cgroup_allow_attach(struct cgroup *cgrp, struct cgroup_taskset *tset) +{ +	const struct cred *cred = current_cred(), *tcred; +	struct task_struct *task; + +	cgroup_taskset_for_each(task, cgrp, tset) { +		tcred = __task_cred(task); + +		if ((current != task) && !capable(CAP_SYS_NICE) && +		    cred->euid != tcred->uid && cred->euid != tcred->suid) +			return -EACCES; +	} + +	return 0; +} +  static int cpu_cgroup_can_attach(struct cgroup *cgrp,  				 struct cgroup_taskset *tset)  { @@ -8075,6 +8092,7 @@ struct cgroup_subsys cpu_cgroup_subsys = {  	.css_offline	= cpu_cgroup_css_offline,  	.can_attach	= cpu_cgroup_can_attach,  	.attach		= cpu_cgroup_attach, +	.allow_attach	= cpu_cgroup_allow_attach,  	.exit		= cpu_cgroup_exit,  	.subsys_id	= cpu_cgroup_subsys_id,  	.base_cftypes	= cpu_files,  |