|
@@ -392,6 +392,30 @@ bool ns_capable(struct user_namespace *ns, int cap)
|
|
|
}
|
|
|
EXPORT_SYMBOL(ns_capable);
|
|
|
|
|
|
+/**
|
|
|
+ * file_ns_capable - Determine if the file's opener had a capability in effect
|
|
|
+ * @file: The file we want to check
|
|
|
+ * @ns: The usernamespace we want the capability in
|
|
|
+ * @cap: The capability to be tested for
|
|
|
+ *
|
|
|
+ * Return true if task that opened the file had a capability in effect
|
|
|
+ * when the file was opened.
|
|
|
+ *
|
|
|
+ * 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)
|
|
|
+{
|
|
|
+ if (WARN_ON_ONCE(!cap_valid(cap)))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (security_capable(file->f_cred, ns, cap) == 0)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(file_ns_capable);
|
|
|
+
|
|
|
/**
|
|
|
* capable - Determine if the current task has a superior capability in effect
|
|
|
* @cap: The capability to be tested for
|