]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ksmbd: Replace strcpy + strcat to improve convert_to_nt_pathname
authorThorsten Blum <thorsten.blum@linux.dev>
Wed, 19 Nov 2025 13:02:30 +0000 (14:02 +0100)
committerSteve French <stfrench@microsoft.com>
Mon, 1 Dec 2025 03:11:45 +0000 (21:11 -0600)
strcpy() is deprecated [1] and using strcat() is discouraged. Replace
them by assigning the prefix directly and by using memcpy() to copy the
pathname. Using memcpy() is safe because we already know the length of
the source string and that it is guaranteed to be NUL-terminated.

Allocate only as many bytes as needed and replace kzalloc() with
kmalloc() since memcpy() overwrites the entire buffer anyway.

Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strcpy
Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/server/misc.c

index cb2a11ffb23fe3844c0d58416b2e714b68b0ed5f..a543ec9d3581778b952bcd89178a36656d5d430f 100644 (file)
@@ -164,6 +164,8 @@ char *convert_to_nt_pathname(struct ksmbd_share_config *share,
 {
        char *pathname, *ab_pathname, *nt_pathname;
        int share_path_len = share->path_sz;
+       size_t ab_pathname_len;
+       int prefix;
 
        pathname = kmalloc(PATH_MAX, KSMBD_DEFAULT_GFP);
        if (!pathname)
@@ -180,15 +182,18 @@ char *convert_to_nt_pathname(struct ksmbd_share_config *share,
                goto free_pathname;
        }
 
-       nt_pathname = kzalloc(strlen(&ab_pathname[share_path_len]) + 2,
-                             KSMBD_DEFAULT_GFP);
+       ab_pathname_len = strlen(&ab_pathname[share_path_len]);
+       prefix = ab_pathname[share_path_len] == '\0' ? 1 : 0;
+       nt_pathname = kmalloc(prefix + ab_pathname_len + 1, KSMBD_DEFAULT_GFP);
        if (!nt_pathname) {
                nt_pathname = ERR_PTR(-ENOMEM);
                goto free_pathname;
        }
-       if (ab_pathname[share_path_len] == '\0')
-               strcpy(nt_pathname, "/");
-       strcat(nt_pathname, &ab_pathname[share_path_len]);
+
+       if (prefix)
+               *nt_pathname = '/';
+       memcpy(nt_pathname + prefix, &ab_pathname[share_path_len],
+              ab_pathname_len + 1);
 
        ksmbd_conv_path_to_windows(nt_pathname);