diff options
| author | Takashi Iwai <tiwai@suse.de> | 2012-01-31 15:13:14 +0100 | 
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2012-01-31 15:13:14 +0100 | 
| commit | ea51e5040e24eefe44d70bc654a237ca1f0225b0 (patch) | |
| tree | df2e5922dcdfafae62a10d8cd97f98121064fc23 /kernel/capability.c | |
| parent | 3422a47041b8cb8f14ac1e3926bcf711121df6dc (diff) | |
| parent | 8dbd52daee38adaae4d5a674bcca837e694a4f4c (diff) | |
Merge branch 'fix/asoc' into for-linus
Diffstat (limited to 'kernel/capability.c')
| -rw-r--r-- | kernel/capability.c | 80 | 
1 files changed, 46 insertions, 34 deletions
| diff --git a/kernel/capability.c b/kernel/capability.c index b463871a4e69..3f1adb6c6470 100644 --- a/kernel/capability.c +++ b/kernel/capability.c @@ -287,74 +287,84 @@ error:  }  /** - * has_capability - Does a task have a capability in init_user_ns + * has_ns_capability - Does a task have a capability in a specific user ns   * @t: The task in question + * @ns: target user namespace   * @cap: The capability to be tested for   *   * Return true if the specified task has the given superior capability - * currently in effect to the initial user namespace, false if not. + * currently in effect to the specified user namespace, false if not.   *   * Note that this does not set PF_SUPERPRIV on the task.   */ -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, &init_user_ns, cap); +	int ret; + +	rcu_read_lock(); +	ret = security_capable(__task_cred(t), ns, cap); +	rcu_read_unlock();  	return (ret == 0);  }  /** - * has_capability - Does a task have a capability in a specific user ns + * has_capability - Does a task have a capability in init_user_ns   * @t: The task in question - * @ns: target user namespace   * @cap: The capability to be tested for   *   * Return true if the specified task has the given superior capability - * currently in effect to the specified user namespace, false if not. + * currently in effect to the initial user namespace, false if not.   *   * Note that this does not set PF_SUPERPRIV on the task.   */ -bool has_ns_capability(struct task_struct *t, -		       struct user_namespace *ns, int cap) +bool has_capability(struct task_struct *t, int cap)  { -	int ret = security_real_capable(t, ns, cap); - -	return (ret == 0); +	return has_ns_capability(t, &init_user_ns, cap);  }  /** - * has_capability_noaudit - Does a task have a capability (unaudited) + * has_ns_capability_noaudit - Does a task have a capability (unaudited) + * in a specific user ns.   * @t: The task in question + * @ns: target user namespace   * @cap: The capability to be tested for   *   * Return true if the specified task has the given superior capability - * currently in effect to init_user_ns, false if not.  Don't write an - * audit message for the check. + * currently in effect to the specified user namespace, false if not. + * Do not write an audit message for the check.   *   * Note that this does not set PF_SUPERPRIV on the task.   */ -bool has_capability_noaudit(struct task_struct *t, int cap) +bool has_ns_capability_noaudit(struct task_struct *t, +			       struct user_namespace *ns, 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), ns, cap); +	rcu_read_unlock();  	return (ret == 0);  }  /** - * capable - Determine if the current task has a superior capability in effect + * has_capability_noaudit - Does a task have a capability (unaudited) in the + * initial user ns + * @t: The task in question   * @cap: The capability to be tested for   * - * Return true if the current task has the given superior capability currently - * available for use, false if not. + * Return true if the specified task has the given superior capability + * currently in effect to init_user_ns, false if not.  Don't write an + * audit message for the check.   * - * This sets PF_SUPERPRIV on the task if the capability is available on the - * assumption that it's about to be used. + * Note that this does not set PF_SUPERPRIV on the task.   */ -bool capable(int cap) +bool has_capability_noaudit(struct task_struct *t, int cap)  { -	return ns_capable(&init_user_ns, cap); +	return has_ns_capability_noaudit(t, &init_user_ns, cap);  } -EXPORT_SYMBOL(capable);  /**   * ns_capable - Determine if the current task has a superior capability in effect @@ -374,7 +384,7 @@ bool ns_capable(struct user_namespace *ns, int cap)  		BUG();  	} -	if (security_capable(ns, current_cred(), cap) == 0) { +	if (security_capable(current_cred(), ns, cap) == 0) {  		current->flags |= PF_SUPERPRIV;  		return true;  	} @@ -383,18 +393,20 @@ bool ns_capable(struct user_namespace *ns, int cap)  EXPORT_SYMBOL(ns_capable);  /** - * task_ns_capable - Determine whether current task has a superior - * capability targeted at a specific task's user namespace. - * @t: The task whose user namespace is targeted. - * @cap: The capability in question. + * capable - Determine if the current task has a superior capability in effect + * @cap: The capability to be tested for + * + * Return true if the current task has the given superior capability currently + * available for use, false if not.   * - *  Return true if it does, false otherwise. + * This sets PF_SUPERPRIV on the task if the capability is available on the + * assumption that it's about to be used.   */ -bool task_ns_capable(struct task_struct *t, int cap) +bool capable(int cap)  { -	return ns_capable(task_cred_xxx(t, user)->user_ns, cap); +	return ns_capable(&init_user_ns, cap);  } -EXPORT_SYMBOL(task_ns_capable); +EXPORT_SYMBOL(capable);  /**   * nsown_capable - Check superior capability to one's own user_ns | 
