]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: client: fix regression with native SMB symlinks
authorPaulo Alcantara <pc@manguebit.org>
Sun, 22 Jun 2025 17:13:40 +0000 (14:13 -0300)
committerSteve French <stfrench@microsoft.com>
Mon, 23 Jun 2025 14:17:25 +0000 (09:17 -0500)
Some users and customers reported that their backup/copy tools started
to fail when the directory being copied contained symlink targets that
the client couldn't parse - even when those symlinks weren't followed.

Fix this by allowing lstat(2) and readlink(2) to succeed even when the
client can't resolve the symlink target, restoring old behavior.

Cc: linux-cifs@vger.kernel.org
Cc: stable@vger.kernel.org
Reported-by: Remy Monsen <monsen@monsen.cc>
Closes: https://lore.kernel.org/r/CAN+tdP7y=jqw3pBndZAGjQv0ObFq8Q=+PUDHgB36HdEz9QA6FQ@mail.gmail.com
Reported-by: Pierguido Lambri <plambri@redhat.com>
Fixes: 12b466eb52d9 ("cifs: Fix creating and resolving absolute NT-style symlinks")
Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/reparse.c

index 511611206dab485d6f10ab241b671ac4a0dbf3e6..1c40e42e4d8973693072a206b168866a0b09f852 100644 (file)
@@ -875,15 +875,8 @@ globalroot:
                        abs_path += sizeof("\\DosDevices\\")-1;
                else if (strstarts(abs_path, "\\GLOBAL??\\"))
                        abs_path += sizeof("\\GLOBAL??\\")-1;
-               else {
-                       /* Unhandled absolute symlink, points outside of DOS/Win32 */
-                       cifs_dbg(VFS,
-                                "absolute symlink '%s' cannot be converted from NT format "
-                                "because points to unknown target\n",
-                                smb_target);
-                       rc = -EIO;
-                       goto out;
-               }
+               else
+                       goto out_unhandled_target;
 
                /* Sometimes path separator after \?? is double backslash */
                if (abs_path[0] == '\\')
@@ -910,13 +903,7 @@ globalroot:
                        abs_path++;
                        abs_path[0] = drive_letter;
                } else {
-                       /* Unhandled absolute symlink. Report an error. */
-                       cifs_dbg(VFS,
-                                "absolute symlink '%s' cannot be converted from NT format "
-                                "because points to unknown target\n",
-                                smb_target);
-                       rc = -EIO;
-                       goto out;
+                       goto out_unhandled_target;
                }
 
                abs_path_len = strlen(abs_path)+1;
@@ -966,6 +953,7 @@ globalroot:
                 * These paths have same format as Linux symlinks, so no
                 * conversion is needed.
                 */
+out_unhandled_target:
                linux_target = smb_target;
                smb_target = NULL;
        }