]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cifs: Set default Netbios RFC1001 server name to hostname in UNC
authorPali Rohár <pali@kernel.org>
Sun, 27 Oct 2024 11:10:52 +0000 (12:10 +0100)
committerSteve French <stfrench@microsoft.com>
Wed, 26 Mar 2025 19:51:50 +0000 (14:51 -0500)
Windows SMB servers (including SMB2+) which are working over RFC1001
require that Netbios server name specified in RFC1001 Session Request
packet is same as the UNC host name. Netbios server name can be already
specified manually via -o servern= option.

With this change the RFC1001 server name is set automatically by extracting
the hostname from the mount source.

Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/fs_context.c

index 8c73d4d60d1a7409bdf46db9ae73b35f0c0cba42..8c5a68ab9e236933a96ba824251c3ba34f43e88f 100644 (file)
@@ -1118,6 +1118,7 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
        int i, opt;
        bool is_smb3 = !strcmp(fc->fs_type->name, "smb3");
        bool skip_parsing = false;
+       char *hostname;
 
        cifs_dbg(FYI, "CIFS: parsing cifs mount option '%s'\n", param->key);
 
@@ -1443,6 +1444,16 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
                        cifs_errorf(fc, "OOM when copying UNC string\n");
                        goto cifs_parse_mount_err;
                }
+               hostname = extract_hostname(ctx->UNC);
+               if (IS_ERR(hostname)) {
+                       cifs_errorf(fc, "Cannot extract hostname from UNC string\n");
+                       goto cifs_parse_mount_err;
+               }
+               /* last byte, type, is 0x20 for servr type */
+               memset(ctx->target_rfc1001_name, 0x20, RFC1001_NAME_LEN_WITH_NULL);
+               for (i = 0; i < RFC1001_NAME_LEN && hostname[i] != 0; i++)
+                       ctx->target_rfc1001_name[i] = toupper(hostname[i]);
+               kfree(hostname);
                break;
        case Opt_user:
                kfree(ctx->username);