Merge tag 'landlock-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mic...
[sfrench/cifs-2.6.git] / fs / namei.c
index 85e9b9cc5c384ff901d785b69c903f1cb85d2294..309ae6fc8c993b8057a560da88de4971fa004127 100644 (file)
@@ -297,13 +297,13 @@ static int check_acl(struct user_namespace *mnt_userns,
                acl = get_cached_acl_rcu(inode, ACL_TYPE_ACCESS);
                if (!acl)
                        return -EAGAIN;
-               /* no ->get_acl() calls in RCU mode... */
+               /* no ->get_inode_acl() calls in RCU mode... */
                if (is_uncached_acl(acl))
                        return -ECHILD;
                return posix_acl_permission(mnt_userns, inode, acl, mask);
        }
 
-       acl = get_acl(inode, ACL_TYPE_ACCESS);
+       acl = get_inode_acl(inode, ACL_TYPE_ACCESS);
        if (IS_ERR(acl))
                return PTR_ERR(acl);
        if (acl) {
@@ -336,11 +336,11 @@ static int acl_permission_check(struct user_namespace *mnt_userns,
                                struct inode *inode, int mask)
 {
        unsigned int mode = inode->i_mode;
-       kuid_t i_uid;
+       vfsuid_t vfsuid;
 
        /* Are we the owner? If so, ACL's don't matter */
-       i_uid = i_uid_into_mnt(mnt_userns, inode);
-       if (likely(uid_eq(current_fsuid(), i_uid))) {
+       vfsuid = i_uid_into_vfsuid(mnt_userns, inode);
+       if (likely(vfsuid_eq_kuid(vfsuid, current_fsuid()))) {
                mask &= 7;
                mode >>= 6;
                return (mask & ~mode) ? -EACCES : 0;
@@ -362,8 +362,8 @@ static int acl_permission_check(struct user_namespace *mnt_userns,
         * about? Need to check group ownership if so.
         */
        if (mask & (mode ^ (mode >> 3))) {
-               kgid_t kgid = i_gid_into_mnt(mnt_userns, inode);
-               if (in_group_p(kgid))
+               vfsgid_t vfsgid = i_gid_into_vfsgid(mnt_userns, inode);
+               if (vfsgid_in_group_p(vfsgid))
                        mode >>= 3;
        }
 
@@ -581,7 +581,7 @@ struct nameidata {
        struct nameidata *saved;
        unsigned        root_seq;
        int             dfd;
-       kuid_t          dir_uid;
+       vfsuid_t        dir_vfsuid;
        umode_t         dir_mode;
 } __randomize_layout;
 
@@ -1095,15 +1095,15 @@ fs_initcall(init_fs_namei_sysctls);
 static inline int may_follow_link(struct nameidata *nd, const struct inode *inode)
 {
        struct user_namespace *mnt_userns;
-       kuid_t i_uid;
+       vfsuid_t vfsuid;
 
        if (!sysctl_protected_symlinks)
                return 0;
 
        mnt_userns = mnt_user_ns(nd->path.mnt);
-       i_uid = i_uid_into_mnt(mnt_userns, inode);
+       vfsuid = i_uid_into_vfsuid(mnt_userns, inode);
        /* Allowed if owner and follower match. */
-       if (uid_eq(current_cred()->fsuid, i_uid))
+       if (vfsuid_eq_kuid(vfsuid, current_fsuid()))
                return 0;
 
        /* Allowed if parent directory not sticky and world-writable. */
@@ -1111,7 +1111,7 @@ static inline int may_follow_link(struct nameidata *nd, const struct inode *inod
                return 0;
 
        /* Allowed if parent directory and link owner match. */
-       if (uid_valid(nd->dir_uid) && uid_eq(nd->dir_uid, i_uid))
+       if (vfsuid_valid(nd->dir_vfsuid) && vfsuid_eq(nd->dir_vfsuid, vfsuid))
                return 0;
 
        if (nd->flags & LOOKUP_RCU)
@@ -1183,8 +1183,8 @@ int may_linkat(struct user_namespace *mnt_userns, const struct path *link)
        struct inode *inode = link->dentry->d_inode;
 
        /* Inode writeback is not safe when the uid or gid are invalid. */
-       if (!uid_valid(i_uid_into_mnt(mnt_userns, inode)) ||
-           !gid_valid(i_gid_into_mnt(mnt_userns, inode)))
+       if (!vfsuid_valid(i_uid_into_vfsuid(mnt_userns, inode)) ||
+           !vfsgid_valid(i_gid_into_vfsgid(mnt_userns, inode)))
                return -EOVERFLOW;
 
        if (!sysctl_protected_hardlinks)
@@ -1232,13 +1232,13 @@ static int may_create_in_sticky(struct user_namespace *mnt_userns,
                                struct nameidata *nd, struct inode *const inode)
 {
        umode_t dir_mode = nd->dir_mode;
-       kuid_t dir_uid = nd->dir_uid;
+       vfsuid_t dir_vfsuid = nd->dir_vfsuid;
 
        if ((!sysctl_protected_fifos && S_ISFIFO(inode->i_mode)) ||
            (!sysctl_protected_regular && S_ISREG(inode->i_mode)) ||
            likely(!(dir_mode & S_ISVTX)) ||
-           uid_eq(i_uid_into_mnt(mnt_userns, inode), dir_uid) ||
-           uid_eq(current_fsuid(), i_uid_into_mnt(mnt_userns, inode)))
+           vfsuid_eq(i_uid_into_vfsuid(mnt_userns, inode), dir_vfsuid) ||
+           vfsuid_eq_kuid(i_uid_into_vfsuid(mnt_userns, inode), current_fsuid()))
                return 0;
 
        if (likely(dir_mode & 0002) ||
@@ -2307,7 +2307,7 @@ static int link_path_walk(const char *name, struct nameidata *nd)
 OK:
                        /* pathname or trailing symlink, done */
                        if (!depth) {
-                               nd->dir_uid = i_uid_into_mnt(mnt_userns, nd->inode);
+                               nd->dir_vfsuid = i_uid_into_vfsuid(mnt_userns, nd->inode);
                                nd->dir_mode = nd->inode->i_mode;
                                nd->flags &= ~LOOKUP_PARENT;
                                return 0;
@@ -2885,9 +2885,9 @@ int __check_sticky(struct user_namespace *mnt_userns, struct inode *dir,
 {
        kuid_t fsuid = current_fsuid();
 
-       if (uid_eq(i_uid_into_mnt(mnt_userns, inode), fsuid))
+       if (vfsuid_eq_kuid(i_uid_into_vfsuid(mnt_userns, inode), fsuid))
                return 0;
-       if (uid_eq(i_uid_into_mnt(mnt_userns, dir), fsuid))
+       if (vfsuid_eq_kuid(i_uid_into_vfsuid(mnt_userns, dir), fsuid))
                return 0;
        return !capable_wrt_inode_uidgid(mnt_userns, inode, CAP_FOWNER);
 }
@@ -2926,8 +2926,8 @@ static int may_delete(struct user_namespace *mnt_userns, struct inode *dir,
        BUG_ON(victim->d_parent->d_inode != dir);
 
        /* Inode writeback is not safe when the uid or gid are invalid. */
-       if (!uid_valid(i_uid_into_mnt(mnt_userns, inode)) ||
-           !gid_valid(i_gid_into_mnt(mnt_userns, inode)))
+       if (!vfsuid_valid(i_uid_into_vfsuid(mnt_userns, inode)) ||
+           !vfsgid_valid(i_gid_into_vfsgid(mnt_userns, inode)))
                return -EOVERFLOW;
 
        audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE);
@@ -3591,6 +3591,7 @@ static int vfs_tmpfile(struct user_namespace *mnt_userns,
        struct inode *dir = d_inode(parentpath->dentry);
        struct inode *inode;
        int error;
+       int open_flag = file->f_flags;
 
        /* we want directory to be writable */
        error = inode_permission(mnt_userns, dir, MAY_WRITE | MAY_EXEC);
@@ -3613,7 +3614,7 @@ static int vfs_tmpfile(struct user_namespace *mnt_userns,
        if (error)
                return error;
        inode = file_inode(file);
-       if (!(file->f_flags & O_EXCL)) {
+       if (!(open_flag & O_EXCL)) {
                spin_lock(&inode->i_lock);
                inode->i_state |= I_LINKABLE;
                spin_unlock(&inode->i_lock);