mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-23 16:53:58 -05:00
cifs: To match file servers, make sure the server hostname matches
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>
This commit is contained in:
parent
3906fe9bb7
commit
7be3248f31
3 changed files with 20 additions and 8 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Reference in a new issue