On Tue, May 18, 2004 at 04:58:14PM -0400, Jeff Trawick wrote:
> Previously we went through this mess on older Mac OS X (DNS queries only?)
>
> I just realized that the glibc shipping with RHAS 2.1 and 3.0 (and surely
> many other Linux distros) has a problem with getnameinfo() for IPv4-mapped
> address for something defined in host file but not in DNS.
I'll file a bug on that if you haven't already.
> The configure check for this condition fails to note the problem because
> (at least in my environments) the DNS has a mapping for
> 127.0.0.1->localhost.
>
> Shall we just assume that the GETNAMEINFO_IPV4_MAPPED_FAILS logic can be
> used on all platforms (incurring the minor overhead), instead of trying to
> be clever?
Sounds very sensible. The code can be simplified to avoid a pointer
dereference too...
--- network_io/unix/sockaddr.c 4 Mar 2004 16:17:25 -0000 1.49
+++ network_io/unix/sockaddr.c 19 May 2004 09:19:07 -0000
@@ -575,27 +575,24 @@
* a numeric address string if it fails to resolve the host name;
* that is *not* what we want here
*
- * Additionally, if we know getnameinfo() doesn't handle IPv4-mapped
- * IPv6 addresses correctly, drop down to IPv4 before calling
- * getnameinfo().
+ * For IPv4-mapped IPv6 addresses, drop down to IPv4 before calling
+ * getnameinfo() to avoid getnameinfo bugs (MacOS X, glibc).
*/
-#ifdef GETNAMEINFO_IPV4_MAPPED_FAILS
if (sockaddr->family == AF_INET6 &&
IN6_IS_ADDR_V4MAPPED(&sockaddr->sa.sin6.sin6_addr)) {
- struct apr_sockaddr_t tmpsa;
- tmpsa.sa.sin.sin_family = AF_INET;
- tmpsa.sa.sin.sin_addr.s_addr = ((uint32_t *)sockaddr->ipaddr_ptr)[3];
+ struct sockaddr_in tmpsa;
+ tmpsa.sin_family = AF_INET;
+ tmpsa.sin_addr.s_addr = sockaddr->sa.sin6.sin6_addr.s6_addr[3];
- rc = getnameinfo((const struct sockaddr *)&tmpsa.sa,
- sizeof(struct sockaddr_in),
+ rc = getnameinfo((const struct sockaddr *)&tmpsa, sizeof(tmpsa),
tmphostname, sizeof(tmphostname), NULL, 0,
flags != 0 ? flags : NI_NAMEREQD);
}
else
-#endif
- rc = getnameinfo((const struct sockaddr *)&sockaddr->sa, sockaddr->salen,
- tmphostname, sizeof(tmphostname), NULL, 0,
- flags != 0 ? flags : NI_NAMEREQD);
+ rc = getnameinfo((const struct sockaddr *)&sockaddr->sa,
sockaddr->salen,
+ tmphostname, sizeof(tmphostname), NULL, 0,
+ flags != 0 ? flags : NI_NAMEREQD);
+
if (rc != 0) {
*hostname = NULL;