diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/capability.c | 18 | 
1 files changed, 15 insertions, 3 deletions
diff --git a/kernel/capability.c b/kernel/capability.c index d98392719ad..ff50ab62cfc 100644 --- a/kernel/capability.c +++ b/kernel/capability.c @@ -298,7 +298,11 @@ error:   */  bool has_capability(struct task_struct *t, int cap)  { -	int ret = security_real_capable(t, &init_user_ns, cap); +	int ret; + +	rcu_read_lock(); +	ret = security_capable(__task_cred(t), &init_user_ns, cap); +	rcu_read_unlock();  	return (ret == 0);  } @@ -317,7 +321,11 @@ bool has_capability(struct task_struct *t, int cap)  bool has_ns_capability(struct task_struct *t,  		       struct user_namespace *ns, int cap)  { -	int ret = security_real_capable(t, ns, cap); +	int ret; + +	rcu_read_lock(); +	ret = security_capable(__task_cred(t), ns, cap); +	rcu_read_unlock();  	return (ret == 0);  } @@ -335,7 +343,11 @@ bool has_ns_capability(struct task_struct *t,   */  bool has_capability_noaudit(struct task_struct *t, int cap)  { -	int ret = security_real_capable_noaudit(t, &init_user_ns, cap); +	int ret; + +	rcu_read_lock(); +	ret = security_capable_noaudit(__task_cred(t), &init_user_ns, cap); +	rcu_read_unlock();  	return (ret == 0);  }  |