X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=fs%2Finode.c;h=1b300a06b8be34d822eb6b75d9ff0a8535aa0d2c;hb=b6b14e987c1f1aed20c494da061b5a90b8265520;hp=00d5fc3b86e12419d2d350032b173009bddcd2cd;hpb=80ce5f6f25bea86f4fbfb9c19c09e43ccac90bfd;p=firefly-linux-kernel-4.4.55.git diff --git a/fs/inode.c b/fs/inode.c index 00d5fc3b86e1..1b300a06b8be 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1837,14 +1837,18 @@ EXPORT_SYMBOL(inode_init_owner); * inode_owner_or_capable - check current task permissions to inode * @inode: inode being checked * - * Return true if current either has CAP_FOWNER to the inode, or - * owns the file. + * Return true if current either has CAP_FOWNER in a namespace with the + * inode owner uid mapped, or owns the file. */ bool inode_owner_or_capable(const struct inode *inode) { + struct user_namespace *ns; + if (uid_eq(current_fsuid(), inode->i_uid)) return true; - if (inode_capable(inode, CAP_FOWNER)) + + ns = current_user_ns(); + if (ns_capable(ns, CAP_FOWNER) && kuid_has_mapping(ns, inode->i_uid)) return true; return false; }