[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:
Steve French 2008-04-26 00:22:23 +00:00
Родитель 404e86e155
Коммит d09e860cf0
1 изменённых файлов: 52 добавлений и 10 удалений

Просмотреть файл

@ -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;
} }