lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 156/917] cifs: To match file servers, make sure the server hostname matches
    Date
    From: Shyam Prasad N <sprasad@microsoft.com>

    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>
    ---
    fs/cifs/connect.c | 19 +++++++++++--------
    fs/cifs/fs_context.c | 8 ++++++++
    fs/cifs/fs_context.h | 1 +
    3 files changed, 20 insertions(+), 8 deletions(-)

    --- a/fs/cifs/connect.c
    +++ b/fs/cifs/connect.c
    @@ -794,7 +794,6 @@ static void clean_demultiplex_info(struc
    */
    }

    - kfree(server->hostname);
    kfree(server);

    length = atomic_dec_return(&tcpSesAllocCount);
    @@ -1235,6 +1234,9 @@ static int match_server(struct TCP_Serve
    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_I
    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_cont
    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);
    --- a/fs/cifs/fs_context.c
    +++ b/fs/cifs/fs_context.c
    @@ -318,6 +318,7 @@ smb3_fs_context_dup(struct smb3_fs_conte
    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,
    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
    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);
    --- a/fs/cifs/fs_context.h
    +++ b/fs/cifs/fs_context.h
    @@ -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 */

    \
     
     \ /
      Last update: 2021-11-16 00:39    [W:4.050 / U:0.304 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site