diff options
Diffstat (limited to 'kernel/capability.c')
| -rw-r--r-- | kernel/capability.c | 57 | 
1 files changed, 22 insertions, 35 deletions
diff --git a/kernel/capability.c b/kernel/capability.c index 4e66bf9275b..a5cf13c018c 100644 --- a/kernel/capability.c +++ b/kernel/capability.c @@ -7,6 +7,8 @@   * 30 May 2002:	Cleanup, Robert M. Love <rml@tech9.net>   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/audit.h>  #include <linux/capability.h>  #include <linux/mm.h> @@ -22,7 +24,6 @@   */  const kernel_cap_t __cap_empty_set = CAP_EMPTY_SET; -  EXPORT_SYMBOL(__cap_empty_set);  int file_caps_enabled = 1; @@ -42,15 +43,10 @@ __setup("no_file_caps", file_caps_disable);  static void warn_legacy_capability_use(void)  { -	static int warned; -	if (!warned) { -		char name[sizeof(current->comm)]; - -		printk(KERN_INFO "warning: `%s' uses 32-bit capabilities" -		       " (legacy support in use)\n", -		       get_task_comm(name, current)); -		warned = 1; -	} +	char name[sizeof(current->comm)]; + +	pr_info_once("warning: `%s' uses 32-bit capabilities (legacy support in use)\n", +		     get_task_comm(name, current));  }  /* @@ -71,16 +67,10 @@ static void warn_legacy_capability_use(void)  static void warn_deprecated_v2(void)  { -	static int warned; +	char name[sizeof(current->comm)]; -	if (!warned) { -		char name[sizeof(current->comm)]; - -		printk(KERN_INFO "warning: `%s' uses deprecated v2" -		       " capabilities in a way that may be insecure.\n", -		       get_task_comm(name, current)); -		warned = 1; -	} +	pr_info_once("warning: `%s' uses deprecated v2 capabilities in a way that may be insecure\n", +		     get_task_comm(name, current));  }  /* @@ -198,7 +188,7 @@ SYSCALL_DEFINE2(capget, cap_user_header_t, header, cap_user_data_t, dataptr)  		 *  		 * An alternative would be to return an error here  		 * (-ERANGE), but that causes legacy applications to -		 * unexpectidly fail; the capget/modify/capset aborts +		 * unexpectedly fail; the capget/modify/capset aborts  		 * before modification is attempted and the application  		 * fails.  		 */ @@ -277,7 +267,7 @@ SYSCALL_DEFINE2(capset, cap_user_header_t, header, const cap_user_data_t, data)  	if (ret < 0)  		goto error; -	audit_log_capset(pid, new, current_cred()); +	audit_log_capset(new, current_cred());  	return commit_creds(new); @@ -380,7 +370,7 @@ bool has_capability_noaudit(struct task_struct *t, int cap)  bool ns_capable(struct user_namespace *ns, int cap)  {  	if (unlikely(!cap_valid(cap))) { -		printk(KERN_CRIT "capable() called with invalid cap=%u\n", cap); +		pr_crit("capable() called with invalid cap=%u\n", cap);  		BUG();  	} @@ -404,7 +394,8 @@ EXPORT_SYMBOL(ns_capable);   * This does not set PF_SUPERPRIV because the caller may not   * actually be privileged.   */ -bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap) +bool file_ns_capable(const struct file *file, struct user_namespace *ns, +		     int cap)  {  	if (WARN_ON_ONCE(!cap_valid(cap)))  		return false; @@ -433,23 +424,19 @@ bool capable(int cap)  EXPORT_SYMBOL(capable);  /** - * inode_capable - Check superior capability over inode + * capable_wrt_inode_uidgid - Check nsown_capable and uid and gid mapped   * @inode: The inode in question   * @cap: The capability in question   * - * Return true if the current task has the given superior capability - * targeted at it's own user namespace and that the given inode is owned - * by the current user namespace or a child namespace. - * - * Currently we check to see if an inode is owned by the current - * user namespace by seeing if the inode's owner maps into the - * current user namespace. - * + * Return true if the current task has the given capability targeted at + * its own user namespace and that the given inode's uid and gid are + * mapped into the current user namespace.   */ -bool inode_capable(const struct inode *inode, int cap) +bool capable_wrt_inode_uidgid(const struct inode *inode, int cap)  {  	struct user_namespace *ns = current_user_ns(); -	return ns_capable(ns, cap) && kuid_has_mapping(ns, inode->i_uid); +	return ns_capable(ns, cap) && kuid_has_mapping(ns, inode->i_uid) && +		kgid_has_mapping(ns, inode->i_gid);  } -EXPORT_SYMBOL(inode_capable); +EXPORT_SYMBOL(capable_wrt_inode_uidgid);  | 
