History

Add file_ns_capable() helper function for open-time capability checking

Nothing is using it yet, but this will allow us to delay the open-time checks to use time, without breaking the normal UNIX permission semantics where permissions are determined by the opener (and the file descriptor can then be passed to a different process, or the process can drop capabilities).

Linus Torvalds committed 13 years ago

Commit 935d8aa1 parent 5b55d702 files · +26 −0Browse files

Unified · Split

2 files
  1. include/linux/capability.h +2 −0
  2. kernel/capability.c +24 −0
include/linux/capability.h+2−0
@@ -35,6 +35,7 @@ struct cpu_vfs_cap_data { · 34 unmodified lines
35#define _KERNEL_CAP_T_SIZE (sizeof(kernel_cap_t))35#define _KERNEL_CAP_T_SIZE (sizeof(kernel_cap_t))
36 36
37 37
38struct file;
38struct inode;39struct inode;
39struct dentry;40struct dentry;
40struct user_namespace;41struct user_namespace;
@@ -211,6 +212,7 @@ extern bool capable(int cap); · 170 unmodified lines
211extern bool ns_capable(struct user_namespace *ns, int cap);212extern bool ns_capable(struct user_namespace *ns, int cap);
212extern bool nsown_capable(int cap);213extern bool nsown_capable(int cap);
213extern bool inode_capable(const struct inode *inode, int cap);214extern bool inode_capable(const struct inode *inode, int cap);
215extern bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap);
214 216
215/* audit system wants to get cap info from files as well */217/* audit system wants to get cap info from files as well */
216extern int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps);218extern int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps);
kernel/capability.c+24−0
@@ -392,6 +392,30 @@ bool ns_capable(struct user_namespace *ns, int cap) · 391 unmodified lines
392}392}
393EXPORT_SYMBOL(ns_capable);393EXPORT_SYMBOL(ns_capable);
394 394
395/**
396 * file_ns_capable - Determine if the file's opener had a capability in effect
397 * @file: The file we want to check
398 * @ns: The usernamespace we want the capability in
399 * @cap: The capability to be tested for
400 *
401 * Return true if task that opened the file had a capability in effect
402 * when the file was opened.
403 *
404 * This does not set PF_SUPERPRIV because the caller may not
405 * actually be privileged.
406 */
407bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap)
408{
409 if (WARN_ON_ONCE(!cap_valid(cap)))
410 return false;
411
412 if (security_capable(file->f_cred, ns, cap) == 0)
413 return true;
414
415 return false;
416}
417EXPORT_SYMBOL(file_ns_capable);
418
395/**419/**
396 * capable - Determine if the current task has a superior capability in effect420 * capable - Determine if the current task has a superior capability in effect
397 * @cap: The capability to be tested for421 * @cap: The capability to be tested for