diff options
Diffstat (limited to 'security/commoncap.c')
| -rw-r--r-- | security/commoncap.c | 42 | 
1 files changed, 13 insertions, 29 deletions
diff --git a/security/commoncap.c b/security/commoncap.c index 7f0b2a68717..79713545cd6 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -43,44 +43,28 @@ int cap_netlink_recv(struct sk_buff *skb, int cap)  EXPORT_SYMBOL(cap_netlink_recv);  /** - * cap_capable - Determine whether current has a particular effective capability + * cap_capable - Determine whether a task has a particular effective capability + * @tsk: The task to query   * @cap: The capability to check for   * @audit: Whether to write an audit message or not   *   * Determine whether the nominated task has the specified capability amongst - * its effective set, returning 0 if it does, -ve if it does not.  Note that - * this uses current's subjective/effective credentials. + * its effective set, returning 0 if it does, -ve if it does not.   *   * NOTE WELL: cap_capable() cannot be used like the kernel's capable()   * function.  That is, it has the reverse semantics: cap_capable() returns 0   * when a task has a capability, but the kernel's capable() returns 1 for this   * case.   */ -int cap_capable(int cap, int audit) +int cap_capable(struct task_struct *tsk, int cap, int audit)  { -	return cap_raised(current_cap(), cap) ? 0 : -EPERM; -} +	__u32 cap_raised; -/** - * cap_has_capability - Determine whether a task has a particular effective capability - * @tsk: The task to query - * @cred: The credentials to use - * @cap: The capability to check for - * @audit: Whether to write an audit message or not - * - * Determine whether the nominated task has the specified capability amongst - * its effective set, returning 0 if it does, -ve if it does not.  Note that - * this uses the task's objective/real credentials. - * - * NOTE WELL: cap_has_capability() cannot be used like the kernel's - * has_capability() function.  That is, it has the reverse semantics: - * cap_has_capability() returns 0 when a task has a capability, but the - * kernel's has_capability() returns 1 for this case. - */ -int cap_task_capable(struct task_struct *tsk, const struct cred *cred, int cap, -		     int audit) -{ -	return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM; +	/* Derived from include/linux/sched.h:capable. */ +	rcu_read_lock(); +	cap_raised = cap_raised(__task_cred(tsk)->cap_effective, cap); +	rcu_read_unlock(); +	return cap_raised ? 0 : -EPERM;  }  /** @@ -176,7 +160,7 @@ static inline int cap_inh_is_capped(void)  	/* they are so limited unless the current task has the CAP_SETPCAP  	 * capability  	 */ -	if (cap_capable(CAP_SETPCAP, SECURITY_CAP_AUDIT) == 0) +	if (cap_capable(current, CAP_SETPCAP, SECURITY_CAP_AUDIT) == 0)  		return 0;  #endif  	return 1; @@ -885,7 +869,7 @@ int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3,  		     & (new->securebits ^ arg2))			/*[1]*/  		    || ((new->securebits & SECURE_ALL_LOCKS & ~arg2))	/*[2]*/  		    || (arg2 & ~(SECURE_ALL_LOCKS | SECURE_ALL_BITS))	/*[3]*/ -		    || (cap_capable(CAP_SETPCAP, SECURITY_CAP_AUDIT) != 0) /*[4]*/ +		    || (cap_capable(current, CAP_SETPCAP, SECURITY_CAP_AUDIT) != 0) /*[4]*/  			/*  			 * [1] no changing of bits that are locked  			 * [2] no unlocking of locks @@ -966,7 +950,7 @@ int cap_vm_enough_memory(struct mm_struct *mm, long pages)  {  	int cap_sys_admin = 0; -	if (cap_capable(CAP_SYS_ADMIN, SECURITY_CAP_NOAUDIT) == 0) +	if (cap_capable(current, CAP_SYS_ADMIN, SECURITY_CAP_NOAUDIT) == 0)  		cap_sys_admin = 1;  	return __vm_enough_memory(mm, pages, cap_sys_admin);  }  |