oops, gethostbyaddr(3) must return h_addr as an IPv4-mapped

IPv6 address when RES_USE_INET6 was set, according to RFC 2133
section 6.2.
This commit is contained in:
Hajimu UMEMOTO 2005-04-30 20:07:01 +00:00
parent fdc9713bf7
commit e84892eb74
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=145728
3 changed files with 17 additions and 6 deletions

View File

@ -246,8 +246,15 @@ _ht_gethostbyaddr(void *rval, void *cb_data, va_list ap)
sethostent_r(0, hed);
while ((error = gethostent_p(he, hed, 0)) == 0)
if (he->h_addrtype == af && !bcmp(he->h_addr, addr, len))
if (he->h_addrtype == af && !bcmp(he->h_addr, addr, len)) {
if (he->h_addrtype == AF_INET &&
_res.options & RES_USE_INET6) {
_map_v4v6_address(he->h_addr, he->h_addr);
he->h_length = IN6ADDRSZ;
he->h_addrtype = AF_INET6;
}
break;
}
endhostent_r(hed);
return (error == 0) ? NS_SUCCESS : NS_NOTFOUND;

View File

@ -50,7 +50,7 @@ __FBSDID("$FreeBSD$");
#ifdef YP
static int
_gethostbynis(const char *name, char *map, int af, struct hostent *he,
struct hostent_data *hed, int mapped)
struct hostent_data *hed)
{
char *p, *bp, *ep;
char *cp, **q;
@ -101,7 +101,7 @@ _gethostbynis(const char *name, char *map, int af, struct hostent *he,
addrok = inet_aton(result, (struct in_addr *)hed->host_addr);
if (addrok != 1)
break;
if (mapped) {
if (_res.options & RES_USE_INET6) {
_map_v4v6_address((char *)hed->host_addr,
(char *)hed->host_addr);
af = AF_INET6;
@ -172,8 +172,7 @@ _gethostbynisname_r(const char *name, int af, struct hostent *he,
map = "ipnodes.byname";
break;
}
return _gethostbynis(name, map, af, he, hed,
_res.options & RES_USE_INET6);
return _gethostbynis(name, map, af, he, hed);
}
static int
@ -193,7 +192,7 @@ _gethostbynisaddr_r(const char *addr, int len, int af, struct hostent *he,
}
if (inet_ntop(af, addr, numaddr, sizeof(numaddr)) == NULL)
return -1;
return _gethostbynis(numaddr, map, af, he, hed, 0);
return _gethostbynis(numaddr, map, af, he, hed);
}
#endif /* YP */

View File

@ -264,6 +264,11 @@ gethostbyaddr_r(const char *addr, int len, int af, struct hostent *he,
{ 0 }
};
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
h_errno = NETDB_INTERNAL;
return -1;
}
if (af == AF_INET6 && len == IN6ADDRSZ) {
addr6 = (const struct in6_addr *)(const void *)uaddr;
if (IN6_IS_ADDR_LINKLOCAL(addr6)) {