Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Shyam Prasad N and committed by
Steve French
7be3248f 3906fe9b

+20 -8
+11 -8
fs/cifs/connect.c
··· 794 794 */ 795 795 } 796 796 797 - kfree(server->hostname); 798 797 kfree(server); 799 798 800 799 length = atomic_dec_return(&tcpSesAllocCount); ··· 1234 1235 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns)) 1235 1236 return 0; 1236 1237 1238 + if (strcasecmp(server->hostname, ctx->server_hostname)) 1239 + return 0; 1240 + 1237 1241 if (!match_address(server, addr, 1238 1242 (struct sockaddr *)&ctx->srcaddr)) 1239 1243 return 0; ··· 1338 1336 kfree(server->session_key.response); 1339 1337 server->session_key.response = NULL; 1340 1338 server->session_key.len = 0; 1339 + kfree(server->hostname); 1341 1340 1342 1341 task = xchg(&server->tsk, NULL); 1343 1342 if (task) ··· 1364 1361 goto out_err; 1365 1362 } 1366 1363 1364 + tcp_ses->hostname = kstrdup(ctx->server_hostname, GFP_KERNEL); 1365 + if (!tcp_ses->hostname) { 1366 + rc = -ENOMEM; 1367 + goto out_err; 1368 + } 1369 + 1367 1370 tcp_ses->ops = ctx->ops; 1368 1371 tcp_ses->vals = ctx->vals; 1369 1372 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns)); 1370 - tcp_ses->hostname = extract_hostname(ctx->UNC); 1371 - if (IS_ERR(tcp_ses->hostname)) { 1372 - rc = PTR_ERR(tcp_ses->hostname); 1373 - goto out_err_crypto_release; 1374 - } 1375 1373 1376 1374 tcp_ses->conn_id = atomic_inc_return(&tcpSesNextId); 1377 1375 tcp_ses->noblockcnt = ctx->rootfs; ··· 1501 1497 1502 1498 out_err: 1503 1499 if (tcp_ses) { 1504 - if (!IS_ERR(tcp_ses->hostname)) 1505 - kfree(tcp_ses->hostname); 1500 + kfree(tcp_ses->hostname); 1506 1501 if (tcp_ses->ssocket) 1507 1502 sock_release(tcp_ses->ssocket); 1508 1503 kfree(tcp_ses);
+8
fs/cifs/fs_context.c
··· 318 318 DUP_CTX_STR(mount_options); 319 319 DUP_CTX_STR(username); 320 320 DUP_CTX_STR(password); 321 + DUP_CTX_STR(server_hostname); 321 322 DUP_CTX_STR(UNC); 322 323 DUP_CTX_STR(source); 323 324 DUP_CTX_STR(domainname); ··· 456 455 pos = strpbrk(devname + 2, delims); 457 456 if (!pos) 458 457 return -EINVAL; 458 + 459 + /* record the server hostname */ 460 + ctx->server_hostname = kstrndup(devname + 2, pos - devname - 2, GFP_KERNEL); 461 + if (!ctx->server_hostname) 462 + return -ENOMEM; 459 463 460 464 /* skip past delimiter */ 461 465 ++pos; ··· 1502 1496 ctx->username = NULL; 1503 1497 kfree_sensitive(ctx->password); 1504 1498 ctx->password = NULL; 1499 + kfree(ctx->server_hostname); 1500 + ctx->server_hostname = NULL; 1505 1501 kfree(ctx->UNC); 1506 1502 ctx->UNC = NULL; 1507 1503 kfree(ctx->source);
+1
fs/cifs/fs_context.h
··· 166 166 char *password; 167 167 char *domainname; 168 168 char *source; 169 + char *server_hostname; 169 170 char *UNC; 170 171 char *nodename; 171 172 char *iocharset; /* local code page for mapping to and from Unicode */