diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/ptrace.c | 10 | ||||
| -rw-r--r-- | kernel/sched/core.c | 10 | 
2 files changed, 16 insertions, 4 deletions
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 1f5e55dda95..7b09b88862c 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -215,8 +215,12 @@ ok:  	smp_rmb();  	if (task->mm)  		dumpable = get_dumpable(task->mm); -	if (!dumpable  && !ptrace_has_cap(task_user_ns(task), mode)) +	rcu_read_lock(); +	if (!dumpable && !ptrace_has_cap(__task_cred(task)->user_ns, mode)) { +		rcu_read_unlock();  		return -EPERM; +	} +	rcu_read_unlock();  	return security_ptrace_access_check(task, mode);  } @@ -280,8 +284,10 @@ static int ptrace_attach(struct task_struct *task, long request,  	if (seize)  		flags |= PT_SEIZED; -	if (ns_capable(task_user_ns(task), CAP_SYS_PTRACE)) +	rcu_read_lock(); +	if (ns_capable(__task_cred(task)->user_ns, CAP_SYS_PTRACE))  		flags |= PT_PTRACE_CAP; +	rcu_read_unlock();  	task->ptrace = flags;  	__ptrace_link(task, current); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 2d8927fda71..2f5eb1838b3 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -4029,8 +4029,14 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)  		goto out_free_cpus_allowed;  	}  	retval = -EPERM; -	if (!check_same_owner(p) && !ns_capable(task_user_ns(p), CAP_SYS_NICE)) -		goto out_unlock; +	if (!check_same_owner(p)) { +		rcu_read_lock(); +		if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) { +			rcu_read_unlock(); +			goto out_unlock; +		} +		rcu_read_unlock(); +	}  	retval = security_task_setscheduler(p);  	if (retval)  |