From 20cc4c87c02444b5836052fac76a57895c3b5f87 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 1 Oct 1999 21:42:39 +0000 Subject: [PATCH] Update. 1999-10-01 Ulrich Drepper * 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. --- ChangeLog | 6 ++++++ 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 + + * 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 * 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;