[CIFS] Adds to dns_resolver checking if the server name is an IP addr and skipping upcall in this case.
Signed-off-by: Igor Mammedov <niallain@gmail.com> Signed-off-by: sfrench@us.ibm.com
This commit is contained in:
Родитель
404e86e155
Коммит
d09e860cf0
|
@ -55,6 +55,32 @@ struct key_type key_type_dns_resolver = {
|
||||||
.match = user_match,
|
.match = user_match,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Checks if supplied name is IP address
|
||||||
|
* returns:
|
||||||
|
* 1 - name is IP
|
||||||
|
* 0 - name is not IP
|
||||||
|
*/
|
||||||
|
static int is_ip(const char *name)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct sockaddr_in sin_server;
|
||||||
|
struct sockaddr_in6 sin_server6;
|
||||||
|
|
||||||
|
rc = cifs_inet_pton(AF_INET, name,
|
||||||
|
&sin_server.sin_addr.s_addr);
|
||||||
|
|
||||||
|
if (rc <= 0) {
|
||||||
|
/* not ipv4 address, try ipv6 */
|
||||||
|
rc = cifs_inet_pton(AF_INET6, name,
|
||||||
|
&sin_server6.sin6_addr.in6_u);
|
||||||
|
if (rc > 0)
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* we failed translating address */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Resolves server name to ip address.
|
/* Resolves server name to ip address.
|
||||||
* input:
|
* input:
|
||||||
|
@ -67,8 +93,9 @@ int
|
||||||
dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
|
dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
|
||||||
{
|
{
|
||||||
int rc = -EAGAIN;
|
int rc = -EAGAIN;
|
||||||
struct key *rkey;
|
struct key *rkey = ERR_PTR(-EAGAIN);
|
||||||
char *name;
|
char *name;
|
||||||
|
char *data = NULL;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (!ip_addr || !unc)
|
if (!ip_addr || !unc)
|
||||||
|
@ -97,26 +124,41 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
|
||||||
memcpy(name, unc+2, len);
|
memcpy(name, unc+2, len);
|
||||||
name[len] = 0;
|
name[len] = 0;
|
||||||
|
|
||||||
|
if (is_ip(name)) {
|
||||||
|
cFYI(1, ("%s: it is IP, skipping dns upcall: %s",
|
||||||
|
__func__, name));
|
||||||
|
data = name;
|
||||||
|
goto skip_upcall;
|
||||||
|
}
|
||||||
|
|
||||||
rkey = request_key(&key_type_dns_resolver, name, "");
|
rkey = request_key(&key_type_dns_resolver, name, "");
|
||||||
if (!IS_ERR(rkey)) {
|
if (!IS_ERR(rkey)) {
|
||||||
len = strlen(rkey->payload.data);
|
data = rkey->payload.data;
|
||||||
*ip_addr = kmalloc(len+1, GFP_KERNEL);
|
cFYI(1, ("%s: resolved: %s to %s", __func__,
|
||||||
if (*ip_addr) {
|
|
||||||
memcpy(*ip_addr, rkey->payload.data, len);
|
|
||||||
(*ip_addr)[len] = '\0';
|
|
||||||
cFYI(1, ("%s: resolved: %s to %s", __func__,
|
|
||||||
rkey->description,
|
rkey->description,
|
||||||
*ip_addr
|
*ip_addr
|
||||||
));
|
));
|
||||||
|
} else {
|
||||||
|
cERROR(1, ("%s: unable to resolve: %s", __func__, name));
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
skip_upcall:
|
||||||
|
if (data) {
|
||||||
|
len = strlen(data);
|
||||||
|
*ip_addr = kmalloc(len+1, GFP_KERNEL);
|
||||||
|
if (*ip_addr) {
|
||||||
|
memcpy(*ip_addr, data, len);
|
||||||
|
(*ip_addr)[len] = '\0';
|
||||||
rc = 0;
|
rc = 0;
|
||||||
} else {
|
} else {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
}
|
}
|
||||||
key_put(rkey);
|
if (!IS_ERR(rkey))
|
||||||
} else {
|
key_put(rkey);
|
||||||
cERROR(1, ("%s: unable to resolve: %s", __func__, name));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
kfree(name);
|
kfree(name);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче