diff options
Diffstat (limited to 'security/smack/smack_access.c')
| -rw-r--r-- | security/smack/smack_access.c | 40 | 
1 files changed, 29 insertions, 11 deletions
diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c index 1a3004189447..9a4c0ad46518 100644 --- a/security/smack/smack_access.c +++ b/security/smack/smack_access.c @@ -623,26 +623,24 @@ struct smack_known *smack_from_secid(const u32 secid)  LIST_HEAD(smack_onlycap_list);  DEFINE_MUTEX(smack_onlycap_lock); -/* +/** + * smack_privileged_cred - are all privilege requirements met by cred + * @cap: The requested capability + * @cred: the credential to use + *   * Is the task privileged and allowed to be privileged   * by the onlycap rule.   *   * Returns true if the task is allowed to be privileged, false if it's not.   */ -bool smack_privileged(int cap) +bool smack_privileged_cred(int cap, const struct cred *cred)  { -	struct smack_known *skp = smk_of_current(); +	struct task_smack *tsp = cred->security; +	struct smack_known *skp = tsp->smk_task;  	struct smack_known_list_elem *sklep;  	int rc; -	/* -	 * All kernel tasks are privileged -	 */ -	if (unlikely(current->flags & PF_KTHREAD)) -		return true; - -	rc = cap_capable(current_cred(), &init_user_ns, cap, -				SECURITY_CAP_AUDIT); +	rc = cap_capable(cred, &init_user_ns, cap, SECURITY_CAP_AUDIT);  	if (rc)  		return false; @@ -662,3 +660,23 @@ bool smack_privileged(int cap)  	return false;  } + +/** + * smack_privileged - are all privilege requirements met + * @cap: The requested capability + * + * Is the task privileged and allowed to be privileged + * by the onlycap rule. + * + * Returns true if the task is allowed to be privileged, false if it's not. + */ +bool smack_privileged(int cap) +{ +	/* +	 * All kernel tasks are privileged +	 */ +	if (unlikely(current->flags & PF_KTHREAD)) +		return true; + +	return smack_privileged_cred(cap, current_cred()); +}  |