Merge tag 'hardening-v6.2-rc1-fixes' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-block.git] / fs / overlayfs / namei.c
index 0fd1d5fdfc728b01bc66ec6f2de39fcc3bff1fe7..46753134533a1effb110d1cab292ac0b97a3a087 100644 (file)
@@ -487,7 +487,8 @@ fail:
 }
 
 /* Get upper dentry from index */
-struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index)
+struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index,
+                              bool connected)
 {
        struct ovl_fh *fh;
        struct dentry *upper;
@@ -499,7 +500,7 @@ struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index)
        if (IS_ERR_OR_NULL(fh))
                return ERR_CAST(fh);
 
-       upper = ovl_decode_real_fh(ofs, fh, ovl_upper_mnt(ofs), true);
+       upper = ovl_decode_real_fh(ofs, fh, ovl_upper_mnt(ofs), connected);
        kfree(fh);
 
        if (IS_ERR_OR_NULL(upper))
@@ -572,7 +573,7 @@ int ovl_verify_index(struct ovl_fs *ofs, struct dentry *index)
         * directly from the index dentry, but for dir index we first need to
         * decode the upper directory.
         */
-       upper = ovl_index_upper(ofs, index);
+       upper = ovl_index_upper(ofs, index, false);
        if (IS_ERR_OR_NULL(upper)) {
                err = PTR_ERR(upper);
                /*
@@ -1085,6 +1086,11 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
                        .mnt = ovl_upper_mnt(ofs),
                };
 
+               /*
+                * It's safe to assign upperredirect here: the previous
+                * assignment of happens only if upperdentry is non-NULL, and
+                * this one only if upperdentry is NULL.
+                */
                upperredirect = ovl_get_redirect_xattr(ofs, &upperpath, 0);
                if (IS_ERR(upperredirect)) {
                        err = PTR_ERR(upperredirect);