Commit 12b5989b authored by Chris Wright's avatar Chris Wright Committed by Linus Torvalds

[PATCH] refactor capable() to one implementation, add __capable() helper

Move capable() to kernel/capability.c and eliminate duplicate
implementations.  Add __capable() function which can be used to check for
capabiilty of any process.
Signed-off-by: default avatarChris Wright <chrisw@sous-sol.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 77d47582
...@@ -357,7 +357,8 @@ static inline kernel_cap_t cap_invert(kernel_cap_t c) ...@@ -357,7 +357,8 @@ static inline kernel_cap_t cap_invert(kernel_cap_t c)
#define cap_is_fs_cap(c) (CAP_TO_MASK(c) & CAP_FS_MASK) #define cap_is_fs_cap(c) (CAP_TO_MASK(c) & CAP_FS_MASK)
extern int capable(int cap); int capable(int cap);
int __capable(struct task_struct *t, int cap);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
...@@ -1040,6 +1040,11 @@ struct swap_info_struct; ...@@ -1040,6 +1040,11 @@ struct swap_info_struct;
* @effective contains the effective capability set. * @effective contains the effective capability set.
* @inheritable contains the inheritable capability set. * @inheritable contains the inheritable capability set.
* @permitted contains the permitted capability set. * @permitted contains the permitted capability set.
* @capable:
* Check whether the @tsk process has the @cap capability.
* @tsk contains the task_struct for the process.
* @cap contains the capability <include/linux/capability.h>.
* Return 0 if the capability is granted for @tsk.
* @acct: * @acct:
* Check permission before enabling or disabling process accounting. If * Check permission before enabling or disabling process accounting. If
* accounting is being enabled, then @file refers to the open file used to * accounting is being enabled, then @file refers to the open file used to
...@@ -1053,11 +1058,6 @@ struct swap_info_struct; ...@@ -1053,11 +1058,6 @@ struct swap_info_struct;
* @table contains the ctl_table structure for the sysctl variable. * @table contains the ctl_table structure for the sysctl variable.
* @op contains the operation (001 = search, 002 = write, 004 = read). * @op contains the operation (001 = search, 002 = write, 004 = read).
* Return 0 if permission is granted. * Return 0 if permission is granted.
* @capable:
* Check whether the @tsk process has the @cap capability.
* @tsk contains the task_struct for the process.
* @cap contains the capability <include/linux/capability.h>.
* Return 0 if the capability is granted for @tsk.
* @syslog: * @syslog:
* Check permission before accessing the kernel message ring or changing * Check permission before accessing the kernel message ring or changing
* logging to the console. * logging to the console.
...@@ -1099,9 +1099,9 @@ struct security_operations { ...@@ -1099,9 +1099,9 @@ struct security_operations {
kernel_cap_t * effective, kernel_cap_t * effective,
kernel_cap_t * inheritable, kernel_cap_t * inheritable,
kernel_cap_t * permitted); kernel_cap_t * permitted);
int (*capable) (struct task_struct * tsk, int cap);
int (*acct) (struct file * file); int (*acct) (struct file * file);
int (*sysctl) (struct ctl_table * table, int op); int (*sysctl) (struct ctl_table * table, int op);
int (*capable) (struct task_struct * tsk, int cap);
int (*quotactl) (int cmds, int type, int id, struct super_block * sb); int (*quotactl) (int cmds, int type, int id, struct super_block * sb);
int (*quota_on) (struct dentry * dentry); int (*quota_on) (struct dentry * dentry);
int (*syslog) (int type); int (*syslog) (int type);
...@@ -1347,6 +1347,11 @@ static inline void security_capset_set (struct task_struct *target, ...@@ -1347,6 +1347,11 @@ static inline void security_capset_set (struct task_struct *target,
security_ops->capset_set (target, effective, inheritable, permitted); security_ops->capset_set (target, effective, inheritable, permitted);
} }
static inline int security_capable(struct task_struct *tsk, int cap)
{
return security_ops->capable(tsk, cap);
}
static inline int security_acct (struct file *file) static inline int security_acct (struct file *file)
{ {
return security_ops->acct (file); return security_ops->acct (file);
...@@ -2050,6 +2055,11 @@ static inline void security_capset_set (struct task_struct *target, ...@@ -2050,6 +2055,11 @@ static inline void security_capset_set (struct task_struct *target,
cap_capset_set (target, effective, inheritable, permitted); cap_capset_set (target, effective, inheritable, permitted);
} }
static inline int security_capable(struct task_struct *tsk, int cap)
{
return cap_capable(tsk, cap);
}
static inline int security_acct (struct file *file) static inline int security_acct (struct file *file)
{ {
return 0; return 0;
......
...@@ -233,3 +233,19 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data) ...@@ -233,3 +233,19 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data)
return ret; return ret;
} }
int __capable(struct task_struct *t, int cap)
{
if (security_capable(t, cap) == 0) {
t->flags |= PF_SUPERPRIV;
return 1;
}
return 0;
}
EXPORT_SYMBOL(__capable);
int capable(int cap)
{
return __capable(current, cap);
}
EXPORT_SYMBOL(capable);
...@@ -224,18 +224,6 @@ int unregister_reboot_notifier(struct notifier_block * nb) ...@@ -224,18 +224,6 @@ int unregister_reboot_notifier(struct notifier_block * nb)
EXPORT_SYMBOL(unregister_reboot_notifier); EXPORT_SYMBOL(unregister_reboot_notifier);
#ifndef CONFIG_SECURITY
int capable(int cap)
{
if (cap_raised(current->cap_effective, cap)) {
current->flags |= PF_SUPERPRIV;
return 1;
}
return 0;
}
EXPORT_SYMBOL(capable);
#endif
static int set_one_prio(struct task_struct *p, int niceval, int error) static int set_one_prio(struct task_struct *p, int niceval, int error)
{ {
int no_nice; int no_nice;
......
...@@ -174,31 +174,8 @@ int mod_unreg_security(const char *name, struct security_operations *ops) ...@@ -174,31 +174,8 @@ int mod_unreg_security(const char *name, struct security_operations *ops)
return security_ops->unregister_security(name, ops); return security_ops->unregister_security(name, ops);
} }
/**
* capable - calls the currently loaded security module's capable() function with the specified capability
* @cap: the requested capability level.
*
* This function calls the currently loaded security module's capable()
* function with a pointer to the current task and the specified @cap value.
*
* This allows the security module to implement the capable function call
* however it chooses to.
*/
int capable(int cap)
{
if (security_ops->capable(current, cap)) {
/* capability denied */
return 0;
}
/* capability granted */
current->flags |= PF_SUPERPRIV;
return 1;
}
EXPORT_SYMBOL_GPL(register_security); EXPORT_SYMBOL_GPL(register_security);
EXPORT_SYMBOL_GPL(unregister_security); EXPORT_SYMBOL_GPL(unregister_security);
EXPORT_SYMBOL_GPL(mod_reg_security); EXPORT_SYMBOL_GPL(mod_reg_security);
EXPORT_SYMBOL_GPL(mod_unreg_security); EXPORT_SYMBOL_GPL(mod_unreg_security);
EXPORT_SYMBOL(capable);
EXPORT_SYMBOL(security_ops); EXPORT_SYMBOL(security_ops);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment