]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
openat2: don't trigger automounts with RESOLVE_NO_XDEV
authorAskar Safin <safinaskar@zohomail.com>
Mon, 25 Aug 2025 18:12:33 +0000 (18:12 +0000)
committerChristian Brauner <brauner@kernel.org>
Tue, 2 Sep 2025 08:40:43 +0000 (10:40 +0200)
openat2 had a bug: if we pass RESOLVE_NO_XDEV, then openat2
doesn't traverse through automounts, but may still trigger them.
(See the link for full bug report with reproducer.)

This commit fixes this bug.

Link: https://lore.kernel.org/linux-fsdevel/20250817075252.4137628-1-safinaskar@zohomail.com/
Fixes: fddb5d430ad9fa91b49b1 ("open: introduce openat2(2) syscall")
Reviewed-by: Aleksa Sarai <cyphar@cyphar.com>
Cc: stable@vger.kernel.org
Signed-off-by: Askar Safin <safinaskar@zohomail.com>
Link: https://lore.kernel.org/20250825181233.2464822-5-safinaskar@zohomail.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/namei.c

index f0ca6f8d0a5f55aae5b2c9d7fa880ce692144341..44856b70ea3b26e4ab3ce15d5353b0ba83ff1159 100644 (file)
@@ -1449,6 +1449,10 @@ static int follow_automount(struct path *path, int *count, unsigned lookup_flags
            dentry->d_inode)
                return -EISDIR;
 
+       /* No need to trigger automounts if mountpoint crossing is disabled. */
+       if (lookup_flags & LOOKUP_NO_XDEV)
+               return -EXDEV;
+
        if (count && (*count)++ >= MAXSYMLINKS)
                return -ELOOP;
 
@@ -1472,6 +1476,10 @@ static int __traverse_mounts(struct path *path, unsigned flags, bool *jumped,
                /* Allow the filesystem to manage the transit without i_rwsem
                 * being held. */
                if (flags & DCACHE_MANAGE_TRANSIT) {
+                       if (lookup_flags & LOOKUP_NO_XDEV) {
+                               ret = -EXDEV;
+                               break;
+                       }
                        ret = path->dentry->d_op->d_manage(path, false);
                        flags = smp_load_acquire(&path->dentry->d_flags);
                        if (ret < 0)