]> git.kaiwu.me - nginx.git/commitdiff
Core: only resolve address families configured on the local system.
authorRuslan Ermilov <ru@nginx.com>
Mon, 5 Aug 2013 06:55:59 +0000 (10:55 +0400)
committerRuslan Ermilov <ru@nginx.com>
Mon, 5 Aug 2013 06:55:59 +0000 (10:55 +0400)
This is done by passing AI_ADDRCONFIG to getaddrinfo().

On Linux, setting net.ipv6.conf.all.disable_ipv6 to 1 will now be
respected.

On FreeBSD, AI_ADDRCONFIG filtering is currently implemented by
attempting to create a datagram socket for the corresponding family,
which succeeds even if the system doesn't in fact have any addresses
of that family configured.  That is, if the system with IPv6 support
in the kernel doesn't have IPv6 addresses configured, AI_ADDRCONFIG
will filter out IPv6 only inside a jail without IPv6 addresses or
with IPv6 disabled.

auto/unix
src/core/ngx_inet.c

index cd4209e7b2f18d1b82de3dab80192be935e7ae39..bc3c0f193c1488d4e1721660aa4e8a5d68262d3c 100755 (executable)
--- a/auto/unix
+++ b/auto/unix
@@ -788,7 +788,11 @@ ngx_feature_incs="#include <sys/types.h>
                   #include <netdb.h>"
 ngx_feature_path=
 ngx_feature_libs=
-ngx_feature_test='struct addrinfo *res;
-                  if (getaddrinfo("localhost", NULL, NULL, &res) != 0) return 1;
+ngx_feature_test='struct addrinfo hints, *res;
+                  hints.ai_family = AF_UNSPEC;
+                  hints.ai_socktype = SOCK_STREAM;
+                  hints.ai_flags = AI_ADDRCONFIG;
+                  if (getaddrinfo("localhost", NULL, &hints, &res) != 0)
+                      return 1;
                   freeaddrinfo(res)'
 . auto/feature
index 5dca72bc212f5f1e1e144d550afe87c0f97abfcb..2b5c94c00be4b0f0c2dab106904002b07a80dd2b 100644 (file)
@@ -963,6 +963,7 @@ ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)
     ngx_memzero(&hints, sizeof(struct addrinfo));
     hints.ai_family = AF_UNSPEC;
     hints.ai_socktype = SOCK_STREAM;
+    hints.ai_flags = AI_ADDRCONFIG;
 
     if (getaddrinfo((char *) host, NULL, &hints, &res) != 0) {
         u->err = "host not found";