]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb: client: Use snprintf in cifs_set_cifscreds
authorThorsten Blum <thorsten.blum@linux.dev>
Thu, 26 Feb 2026 22:15:22 +0000 (23:15 +0100)
committerSteve French <stfrench@microsoft.com>
Fri, 27 Feb 2026 16:19:54 +0000 (10:19 -0600)
Replace unbounded sprintf() calls with the safer snprintf(). Avoid using
magic numbers and use strlen() to calculate the key descriptor buffer
size. Save the size in a local variable and reuse it for the bounded
snprintf() calls. Remove CIFSCREDS_DESC_SIZE.

Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
Acked-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/connect.c

index 4c34d9603e0533f61c93524517f3e6e20b3fe01d..3bad2c5c523dbd1d4b1ab253567984612be0f348 100644 (file)
@@ -2167,9 +2167,6 @@ void __cifs_put_smb_ses(struct cifs_ses *ses)
 
 #ifdef CONFIG_KEYS
 
-/* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
-#define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
-
 /* Populate username and pw fields from keyring if possible */
 static int
 cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
@@ -2177,6 +2174,7 @@ cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
        int rc = 0;
        int is_domain = 0;
        const char *delim, *payload;
+       size_t desc_sz;
        char *desc;
        ssize_t len;
        struct key *key;
@@ -2185,7 +2183,9 @@ cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
        struct sockaddr_in6 *sa6;
        const struct user_key_payload *upayload;
 
-       desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
+       /* "cifs:a:" and "cifs:d:" are the same length; +1 for NUL terminator */
+       desc_sz = strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1;
+       desc = kmalloc(desc_sz, GFP_KERNEL);
        if (!desc)
                return -ENOMEM;
 
@@ -2193,11 +2193,11 @@ cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
        switch (server->dstaddr.ss_family) {
        case AF_INET:
                sa = (struct sockaddr_in *)&server->dstaddr;
-               sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
+               snprintf(desc, desc_sz, "cifs:a:%pI4", &sa->sin_addr.s_addr);
                break;
        case AF_INET6:
                sa6 = (struct sockaddr_in6 *)&server->dstaddr;
-               sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
+               snprintf(desc, desc_sz, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
                break;
        default:
                cifs_dbg(FYI, "Bad ss_family (%hu)\n",
@@ -2216,7 +2216,7 @@ cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
                }
 
                /* didn't work, try to find a domain key */
-               sprintf(desc, "cifs:d:%s", ses->domainName);
+               snprintf(desc, desc_sz, "cifs:d:%s", ses->domainName);
                cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
                key = request_key(&key_type_logon, desc, "");
                if (IS_ERR(key)) {