]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
smb: client: handle max length for SMB symlinks
authorPaulo Alcantara <pc@manguebit.com>
Mon, 18 Nov 2024 15:35:16 +0000 (12:35 -0300)
committerSteve French <stfrench@microsoft.com>
Thu, 21 Nov 2024 16:45:50 +0000 (10:45 -0600)
We can't use PATH_MAX for SMB symlinks because

  (1) Windows Server will fail FSCTL_SET_REPARSE_POINT with
      STATUS_IO_REPARSE_DATA_INVALID when input buffer is larger than
      16K, as specified in MS-FSA 2.1.5.10.37.

  (2) The client won't be able to parse large SMB responses that
      includes SMB symlink path within SMB2_CREATE or SMB2_IOCTL
      responses.

Fix this by defining a maximum length value (4060) for SMB symlinks
that both client and server can handle.

Cc: David Howells <dhowells@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/reparse.c
fs/smb/client/reparse.h

index 74abbdf5026c73ec1e271fc176ab45a661fb1819..90da1e2b6217b6afe00f4cff9be601e8a5aff2d7 100644 (file)
@@ -35,6 +35,9 @@ int smb2_create_reparse_symlink(const unsigned int xid, struct inode *inode,
        u16 len, plen;
        int rc = 0;
 
+       if (strlen(symname) > REPARSE_SYM_PATH_MAX)
+               return -ENAMETOOLONG;
+
        sym = kstrdup(symname, GFP_KERNEL);
        if (!sym)
                return -ENOMEM;
@@ -64,7 +67,7 @@ int smb2_create_reparse_symlink(const unsigned int xid, struct inode *inode,
        if (rc < 0)
                goto out;
 
-       plen = 2 * UniStrnlen((wchar_t *)path, PATH_MAX);
+       plen = 2 * UniStrnlen((wchar_t *)path, REPARSE_SYM_PATH_MAX);
        len = sizeof(*buf) + plen * 2;
        buf = kzalloc(len, GFP_KERNEL);
        if (!buf) {
index 158e7b7aae646c5544064d8b264726fa8b6e99e3..2a9f4f9f79de08c40cf66f63b2a5c511bd59c4ad 100644 (file)
@@ -12,6 +12,8 @@
 #include "fs_context.h"
 #include "cifsglob.h"
 
+#define REPARSE_SYM_PATH_MAX 4060
+
 /*
  * Used only by cifs.ko to ignore reparse points from files when client or
  * server doesn't support FSCTL_GET_REPARSE_POINT.