diff options
Diffstat (limited to 'kernel/futex_compat.c')
| -rw-r--r-- | kernel/futex_compat.c | 11 | 
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index a7934ac75e5b..5f9e689dc8f0 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c @@ -153,10 +153,19 @@ compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,  			goto err_unlock;  		ret = -EPERM;  		pcred = __task_cred(p); +		/* If victim is in different user_ns, then uids are not +		   comparable, so we must have CAP_SYS_PTRACE */ +		if (cred->user->user_ns != pcred->user->user_ns) { +			if (!ns_capable(pcred->user->user_ns, CAP_SYS_PTRACE)) +				goto err_unlock; +			goto ok; +		} +		/* If victim is in same user_ns, then uids are comparable */  		if (cred->euid != pcred->euid &&  		    cred->euid != pcred->uid && -		    !capable(CAP_SYS_PTRACE)) +		    !ns_capable(pcred->user->user_ns, CAP_SYS_PTRACE))  			goto err_unlock; +ok:  		head = p->compat_robust_list;  		rcu_read_unlock();  	}  | 
