Skip to content

Commit 4b1b4c8

Browse files
Paulo Alcantarasmfrench
authored andcommitted
smb: client: provide dns_resolve_{unc,name} helpers
Some places pass hostnames rather than UNC paths to resolve them to ip addresses, so provide helpers to handle both cases and then stop converting hostnames to UNC paths by inserting path delimiters into them. Also kill @expiry parameter as it's not used anywhere. Signed-off-by: Paulo Alcantara (Red Hat) <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 489d152 commit 4b1b4c8

File tree

7 files changed

+59
-86
lines changed

7 files changed

+59
-86
lines changed

fs/smb/client/cifsproto.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,7 @@ static inline int get_dfs_path(const unsigned int xid, struct cifs_ses *ses,
680680
}
681681

682682
int match_target_ip(struct TCP_Server_Info *server,
683-
const char *share, size_t share_len,
683+
const char *host, size_t hostlen,
684684
bool *result);
685685
int cifs_inval_name_dfs_link_error(const unsigned int xid,
686686
struct cifs_tcon *tcon,

fs/smb/client/connect.c

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,8 @@ static void cifs_prune_tlinks(struct work_struct *work);
7272
*/
7373
static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
7474
{
75-
int rc;
76-
int len;
77-
char *unc;
7875
struct sockaddr_storage ss;
76+
int rc;
7977

8078
if (!server->hostname)
8179
return -EINVAL;
@@ -84,33 +82,18 @@ static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
8482
if (server->hostname[0] == '\0')
8583
return 0;
8684

87-
len = strlen(server->hostname) + 3;
88-
89-
unc = kmalloc(len, GFP_KERNEL);
90-
if (!unc) {
91-
cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
92-
return -ENOMEM;
93-
}
94-
scnprintf(unc, len, "\\\\%s", server->hostname);
95-
9685
spin_lock(&server->srv_lock);
9786
ss = server->dstaddr;
9887
spin_unlock(&server->srv_lock);
9988

100-
rc = dns_resolve_server_name_to_ip(server->dns_dom, unc,
101-
(struct sockaddr *)&ss, NULL);
102-
kfree(unc);
103-
104-
if (rc < 0) {
105-
cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
106-
__func__, server->hostname, rc);
107-
} else {
89+
rc = dns_resolve_name(server->dns_dom, server->hostname,
90+
strlen(server->hostname),
91+
(struct sockaddr *)&ss);
92+
if (!rc) {
10893
spin_lock(&server->srv_lock);
10994
memcpy(&server->dstaddr, &ss, sizeof(server->dstaddr));
11095
spin_unlock(&server->srv_lock);
111-
rc = 0;
11296
}
113-
11497
return rc;
11598
}
11699

fs/smb/client/dfs.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,8 @@ int dfs_parse_target_referral(const char *full_path, const struct dfs_info3_para
4848
if (rc)
4949
goto out;
5050

51-
rc = dns_resolve_server_name_to_ip(DFS_DOM(ctx), path,
52-
(struct sockaddr *)&ctx->dstaddr,
53-
NULL);
51+
rc = dns_resolve_unc(DFS_DOM(ctx), path,
52+
(struct sockaddr *)&ctx->dstaddr);
5453
out:
5554
kfree(path);
5655
return rc;
@@ -268,8 +267,7 @@ static int update_fs_context_dstaddr(struct smb3_fs_context *ctx)
268267
int rc = 0;
269268

270269
if (!ctx->nodfs && ctx->dfs_automount) {
271-
rc = dns_resolve_server_name_to_ip(NULL, ctx->source,
272-
addr, NULL);
270+
rc = dns_resolve_unc(NULL, ctx->source, addr);
273271
if (!rc)
274272
cifs_set_port(addr, ctx->port);
275273
ctx->dfs_automount = false;

fs/smb/client/dfs_cache.c

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,11 +1096,8 @@ int dfs_cache_get_tgt_share(char *path, const struct dfs_cache_tgt_iterator *it,
10961096
static bool target_share_equal(struct cifs_tcon *tcon, const char *s1)
10971097
{
10981098
struct TCP_Server_Info *server = tcon->ses->server;
1099-
struct sockaddr_storage ss;
1100-
const char *host;
11011099
const char *s2 = &tcon->tree_name[1];
1102-
size_t hostlen;
1103-
char unc[sizeof("\\\\") + SERVER_NAME_LENGTH] = {0};
1100+
struct sockaddr_storage ss;
11041101
bool match;
11051102
int rc;
11061103

@@ -1111,19 +1108,13 @@ static bool target_share_equal(struct cifs_tcon *tcon, const char *s1)
11111108
* Resolve share's hostname and check if server address matches. Otherwise just ignore it
11121109
* as we could not have upcall to resolve hostname or failed to convert ip address.
11131110
*/
1114-
extract_unc_hostname(s1, &host, &hostlen);
1115-
scnprintf(unc, sizeof(unc), "\\\\%.*s", (int)hostlen, host);
1116-
1117-
rc = dns_resolve_server_name_to_ip(server->dns_dom, unc,
1118-
(struct sockaddr *)&ss, NULL);
1119-
if (rc < 0) {
1120-
cifs_dbg(FYI, "%s: could not resolve %.*s. assuming server address matches.\n",
1121-
__func__, (int)hostlen, host);
1111+
rc = dns_resolve_unc(server->dns_dom, s1, (struct sockaddr *)&ss);
1112+
if (rc < 0)
11221113
return true;
1123-
}
11241114

11251115
cifs_server_lock(server);
11261116
match = cifs_match_ipaddr((struct sockaddr *)&server->dstaddr, (struct sockaddr *)&ss);
1117+
cifs_dbg(FYI, "%s: [share=%s] ipaddr matched: %s\n", __func__, s1, str_yes_no(match));
11271118
cifs_server_unlock(server);
11281119

11291120
return match;

fs/smb/client/dns_resolve.c

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,19 @@
2020
#include "cifsproto.h"
2121
#include "cifs_debug.h"
2222

23-
static int resolve_name(const char *name, size_t namelen,
24-
struct sockaddr *addr, time64_t *expiry)
23+
static int resolve_name(const char *name, size_t namelen, struct sockaddr *addr)
2524
{
2625
char *ip;
2726
int rc;
2827

2928
rc = dns_query(current->nsproxy->net_ns, NULL, name,
30-
namelen, NULL, &ip, expiry, false);
29+
namelen, NULL, &ip, NULL, false);
3130
if (rc < 0) {
3231
cifs_dbg(FYI, "%s: unable to resolve: %*.*s\n",
3332
__func__, (int)namelen, (int)namelen, name);
3433
} else {
35-
cifs_dbg(FYI, "%s: resolved: %*.*s to %s expiry %llu\n",
36-
__func__, (int)namelen, (int)namelen, name, ip,
37-
expiry ? (*expiry) : 0);
34+
cifs_dbg(FYI, "%s: resolved: %*.*s to %s\n",
35+
__func__, (int)namelen, (int)namelen, name, ip);
3836

3937
rc = cifs_convert_address(addr, ip, strlen(ip));
4038
kfree(ip);
@@ -50,31 +48,23 @@ static int resolve_name(const char *name, size_t namelen,
5048
}
5149

5250
/**
53-
* dns_resolve_server_name_to_ip - Resolve UNC server name to ip address.
54-
* @dom: optional DNS domain name
55-
* @unc: UNC path specifying the server (with '/' as delimiter)
56-
* @ip_addr: Where to return the IP address.
57-
* @expiry: Where to return the expiry time for the dns record.
51+
* dns_resolve_name - Perform an upcall to resolve hostname to an ip address.
52+
* @dom: DNS domain name (or NULL)
53+
* @name: Name to look up
54+
* @namelen: Length of name
55+
* @ip_addr: Where to return the IP address
5856
*
59-
* Returns zero success, -ve on error.
57+
* Returns zero on success, -ve code otherwise.
6058
*/
61-
int dns_resolve_server_name_to_ip(const char *dom, const char *unc,
62-
struct sockaddr *ip_addr, time64_t *expiry)
59+
int dns_resolve_name(const char *dom, const char *name,
60+
size_t namelen, struct sockaddr *ip_addr)
6361
{
64-
const char *name;
65-
size_t namelen, len;
62+
size_t len;
6663
char *s;
6764
int rc;
6865

69-
if (!ip_addr || !unc)
70-
return -EINVAL;
71-
72-
cifs_dbg(FYI, "%s: dom=%s unc=%s\n", __func__, dom, unc);
73-
if (strlen(unc) < 3)
74-
return -EINVAL;
75-
76-
extract_unc_hostname(unc, &name, &namelen);
77-
if (!namelen)
66+
cifs_dbg(FYI, "%s: dom=%s name=%.*s\n", __func__, dom, (int)namelen, name);
67+
if (!ip_addr || !name || !*name || !namelen)
7868
return -EINVAL;
7969

8070
cifs_dbg(FYI, "%s: hostname=%.*s\n", __func__, (int)namelen, name);
@@ -97,10 +87,10 @@ int dns_resolve_server_name_to_ip(const char *dom, const char *unc,
9787
return -ENOMEM;
9888

9989
scnprintf(s, len, "%.*s.%s", (int)namelen, name, dom);
100-
rc = resolve_name(s, len - 1, ip_addr, expiry);
90+
rc = resolve_name(s, len - 1, ip_addr);
10191
kfree(s);
10292
if (!rc)
10393
return 0;
10494
}
105-
return resolve_name(name, namelen, ip_addr, expiry);
95+
return resolve_name(name, namelen, ip_addr);
10696
}

fs/smb/client/dns_resolve.h

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,30 @@
1212
#define _DNS_RESOLVE_H
1313

1414
#include <linux/net.h>
15+
#include "cifsglob.h"
16+
#include "cifsproto.h"
1517

1618
#ifdef __KERNEL__
17-
int dns_resolve_server_name_to_ip(const char *dom, const char *unc,
18-
struct sockaddr *ip_addr, time64_t *expiry);
19+
20+
int dns_resolve_name(const char *dom, const char *name,
21+
size_t namelen, struct sockaddr *ip_addr);
22+
23+
static inline int dns_resolve_unc(const char *dom, const char *unc,
24+
struct sockaddr *ip_addr)
25+
{
26+
const char *name;
27+
size_t namelen;
28+
29+
if (!unc || strlen(unc) < 3)
30+
return -EINVAL;
31+
32+
extract_unc_hostname(unc, &name, &namelen);
33+
if (!namelen)
34+
return -EINVAL;
35+
36+
return dns_resolve_name(dom, name, namelen, ip_addr);
37+
}
38+
1939
#endif /* KERNEL */
2040

2141
#endif /* _DNS_RESOLVE_H */

fs/smb/client/misc.c

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,34 +1172,25 @@ void cifs_put_tcp_super(struct super_block *sb)
11721172

11731173
#ifdef CONFIG_CIFS_DFS_UPCALL
11741174
int match_target_ip(struct TCP_Server_Info *server,
1175-
const char *share, size_t share_len,
1175+
const char *host, size_t hostlen,
11761176
bool *result)
11771177
{
1178-
int rc;
1179-
char *target;
11801178
struct sockaddr_storage ss;
1179+
int rc;
11811180

1182-
*result = false;
1183-
1184-
target = kzalloc(share_len + 3, GFP_KERNEL);
1185-
if (!target)
1186-
return -ENOMEM;
1187-
1188-
scnprintf(target, share_len + 3, "\\\\%.*s", (int)share_len, share);
1189-
1190-
cifs_dbg(FYI, "%s: target name: %s\n", __func__, target + 2);
1181+
cifs_dbg(FYI, "%s: hostname=%.*s\n", __func__, (int)hostlen, host);
11911182

1192-
rc = dns_resolve_server_name_to_ip(server->dns_dom, target,
1193-
(struct sockaddr *)&ss, NULL);
1194-
kfree(target);
1183+
*result = false;
11951184

1185+
rc = dns_resolve_name(server->dns_dom, host, hostlen,
1186+
(struct sockaddr *)&ss);
11961187
if (rc < 0)
11971188
return rc;
11981189

11991190
spin_lock(&server->srv_lock);
12001191
*result = cifs_match_ipaddr((struct sockaddr *)&server->dstaddr, (struct sockaddr *)&ss);
12011192
spin_unlock(&server->srv_lock);
1202-
cifs_dbg(FYI, "%s: ip addresses match: %u\n", __func__, *result);
1193+
cifs_dbg(FYI, "%s: ip addresses matched: %s\n", __func__, str_yes_no(*result));
12031194
return 0;
12041195
}
12051196

0 commit comments

Comments
 (0)