]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
cifs: To match file servers, make sure the server hostname matches
authorShyam Prasad N <sprasad@microsoft.com>
Thu, 14 Oct 2021 11:52:39 +0000 (11:52 +0000)
committerAndrea Righi <andrea.righi@canonical.com>
Tue, 7 Dec 2021 06:32:37 +0000 (07:32 +0100)
BugLink: https://bugs.launchpad.net/bugs/1951822
commit 7be3248f313930ff3d3436d4e9ddbe9fccc1f541 upstream.

We generally rely on a bunch of factors to differentiate between servers.
For example, IP address, port etc.

For certain server types (like Azure), it is important to make sure
that the server hostname matches too, even if the both hostnames currently
resolve to the same IP address.

Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Cc: stable@vger.kernel.org
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
fs/cifs/connect.c
fs/cifs/fs_context.c
fs/cifs/fs_context.h

index c3b94c1e4591338b58304b088b2f07541dcfd741..e6e261dfd107968f63c81fcd60028ca3133ee352 100644 (file)
@@ -794,7 +794,6 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server)
                 */
        }
 
-       kfree(server->hostname);
        kfree(server);
 
        length = atomic_dec_return(&tcpSesAllocCount);
@@ -1235,6 +1234,9 @@ static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context *
        if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
                return 0;
 
+       if (strcasecmp(server->hostname, ctx->server_hostname))
+               return 0;
+
        if (!match_address(server, addr,
                           (struct sockaddr *)&ctx->srcaddr))
                return 0;
@@ -1336,6 +1338,7 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
        kfree(server->session_key.response);
        server->session_key.response = NULL;
        server->session_key.len = 0;
+       kfree(server->hostname);
 
        task = xchg(&server->tsk, NULL);
        if (task)
@@ -1361,14 +1364,15 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx)
                goto out_err;
        }
 
+       tcp_ses->hostname = kstrdup(ctx->server_hostname, GFP_KERNEL);
+       if (!tcp_ses->hostname) {
+               rc = -ENOMEM;
+               goto out_err;
+       }
+
        tcp_ses->ops = ctx->ops;
        tcp_ses->vals = ctx->vals;
        cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
-       tcp_ses->hostname = extract_hostname(ctx->UNC);
-       if (IS_ERR(tcp_ses->hostname)) {
-               rc = PTR_ERR(tcp_ses->hostname);
-               goto out_err_crypto_release;
-       }
 
        tcp_ses->conn_id = atomic_inc_return(&tcpSesNextId);
        tcp_ses->noblockcnt = ctx->rootfs;
@@ -1497,8 +1501,7 @@ out_err_crypto_release:
 
 out_err:
        if (tcp_ses) {
-               if (!IS_ERR(tcp_ses->hostname))
-                       kfree(tcp_ses->hostname);
+               kfree(tcp_ses->hostname);
                if (tcp_ses->ssocket)
                        sock_release(tcp_ses->ssocket);
                kfree(tcp_ses);
index 3109def8e19989ac6ad78768eac6bca4eabf4912..4130908af8d77e4b0454b0f37a63449fee3a70c0 100644 (file)
@@ -318,6 +318,7 @@ smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx
        DUP_CTX_STR(mount_options);
        DUP_CTX_STR(username);
        DUP_CTX_STR(password);
+       DUP_CTX_STR(server_hostname);
        DUP_CTX_STR(UNC);
        DUP_CTX_STR(source);
        DUP_CTX_STR(domainname);
@@ -456,6 +457,11 @@ smb3_parse_devname(const char *devname, struct smb3_fs_context *ctx)
        if (!pos)
                return -EINVAL;
 
+       /* record the server hostname */
+       ctx->server_hostname = kstrndup(devname + 2, pos - devname - 2, GFP_KERNEL);
+       if (!ctx->server_hostname)
+               return -ENOMEM;
+
        /* skip past delimiter */
        ++pos;
 
@@ -1496,6 +1502,8 @@ smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx)
        ctx->username = NULL;
        kfree_sensitive(ctx->password);
        ctx->password = NULL;
+       kfree(ctx->server_hostname);
+       ctx->server_hostname = NULL;
        kfree(ctx->UNC);
        ctx->UNC = NULL;
        kfree(ctx->source);
index a42ba71d7a81fb0181788ab4ffd1d90ba671435a..29601a4eb411659d63488b66c05b22a97a8d4a46 100644 (file)
@@ -166,6 +166,7 @@ struct smb3_fs_context {
        char *password;
        char *domainname;
        char *source;
+       char *server_hostname;
        char *UNC;
        char *nodename;
        char *iocharset;  /* local code page for mapping to and from Unicode */