diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | resolv/nss_dns/dns-host.c | 10 |
2 files changed, 12 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index 5aa6ce80f6..2ef7e9af14 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +1999-10-01 Ulrich Drepper <drepper@cygnus.com> + + * resolv/nss_dns/dns-host.c (_nss_dns_gethostbyaddr_r): Align + handling of IPv6 tunnel address handling with bind 8.2.1. Allow + len argument to be greater than needed address size. + 1999-10-01 Andreas Jaeger <aj@suse.de> * locale/programs/ld-collate.c (insert_value): Add cast to avoid diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index c075961e91..482cbd3ab4 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -197,6 +197,7 @@ _nss_dns_gethostbyaddr_r (const char *addr, size_t len, int af, { static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; + static const u_char v6local[] = { 0,0, 0,1 }; const u_char *uaddr = (const u_char *)addr; struct host_data { @@ -210,9 +211,10 @@ _nss_dns_gethostbyaddr_r (const char *addr, size_t len, int af, size_t size; int n, status; - if (af == AF_INET6 && len == IN6ADDRSZ && - (memcmp (uaddr, mapped, sizeof mapped) == 0 - || memcmp (uaddr, tunnelled, sizeof tunnelled) == 0)) + if (af == AF_INET6 && len == IN6ADDRSZ + && (memcmp (uaddr, mapped, sizeof mapped) == 0 + || (memcmp (uaddr, tunnelled, sizeof tunnelled) == 0 + && memcmp (&uaddr[sizeof tunnelled], v6local, sizeof v6local)))) { /* Unmap. */ addr += sizeof mapped; @@ -234,7 +236,7 @@ _nss_dns_gethostbyaddr_r (const char *addr, size_t len, int af, *h_errnop = NETDB_INTERNAL; return NSS_STATUS_UNAVAIL; } - if (size != len) + if (size > len) { *errnop = EAFNOSUPPORT; *h_errnop = NETDB_INTERNAL; |