diff options
Diffstat (limited to 'kernel/ptrace.c')
| -rw-r--r-- | kernel/ptrace.c | 10 | 
1 files changed, 8 insertions, 2 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);  |