patch to apache for IPv6 only httpd

Olli Hauer ohauer at FreeBSD.org
Mon Aug 13 19:46:52 UTC 2012


On 2012-08-13 20:08, Curtis Villamizar wrote:
> In message <CACM2dAaQLa38rLvbOfXJb6wFzrV_E0DUL6cxT9dher6G_6v4bA at mail.gmail.com>
> "Philip M. Gollucci" writes:
>  
>> What happens if you try to bind to an ip address the machine doesn't
>> have whether v4 or v6 with this patch ?
> 
> 
> In that case there is no change to the behavior although "assert" may
> not be the best diagnostic, the same thing happens with or without the
> patch if the address is not present.
> 
> The code here insures that the server does not start unless it has at
> least one valid address.  The hostname is provided as NULL and a
> lookup is done.  The old code looks for any valid IPv4 address.  The
> code breaks if there are no IPv4 addresses, there are only valid IPv6
> addresses.  The patch repeats the check with AF_UNSPEC (accept
> anything) and this would pick up a valid IPv6 address and avoid the
> assert.  If there were no valid addresses, then prior code that
> produced a list of addresses is broken and this code does the same as
> before the patch - it asserts.
> 
> apr_sockaddr_info_get is in srclib/apr/network_io/unix/sockaddr.c
> where it does some checking, calls call_resolver if getaddrinfo
> exists, otherwise gethostbyname with the hostname.  In call_resolver
> getaddrinfo (see man page) is called which returns a struct addrinfo
> which has a list of addresses.  If an address string is provided,
> there will be one address in the list.  call_resolver will only return
> an AF_INET or AF_INET6 address (it creates a linked list in the
> argument p, using calloc to allocate entries).
> 
> The assumption in this code is that you can't get here without a valid
> address, but then in testing that assumption, only a valid IPv4
> address is accepted.
> 
> After this test, the result does not appear to be used (otherwise DS
> machines wouldn't work).  The addresses from the config file are used
> in alloc_listener which calls apr_sockaddr_info_get with APR_UNSPEC
> and a port number.  The addresses from the config file may have
> absolutely nothing to do with the list of addresses returned by
> gethostbyname in the prior check.
> 
> Curtis

I think we can include the diff from Curtis as general patch.
The test for an IPv6 address (APR_INE6) will be done only if the
first test on APR_INET fails.

@Phillip
any objection?


@Cutis:
the resulting patch with APR_INET6 instead APR_UNSPEC

--- ./server/config.c.orig      2012-08-13 21:15:02.000000000 +0200
+++ ./server/config.c   2012-08-13 21:22:15.000000000 +0200
@@ -1979,6 +1979,11 @@
     /* NOT virtual host; don't match any real network interface */
     rv = apr_sockaddr_info_get(&s->addrs->host_addr,
                                NULL, APR_INET, 0, 0, p);
+    /* Support for IPv6 only, reported by Curtis Villamizar <curtis at occnc.com> */
+    /* http://lists.freebsd.org/pipermail/freebsd-apache/2012-August/002836.html */
+    if (rv != APR_SUCCESS)
+           rv = apr_sockaddr_info_get(&s->addrs->host_addr,
+                           NULL, APR_INET6, 0, 0, p);
     ap_assert(rv == APR_SUCCESS); /* otherwise: bug or no storage */

     s->addrs->host_port = 0; /* matches any port */




More information about the freebsd-apache mailing list