patch to apache for IPv6 only httpd
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.
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.
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