# HG changeset patch # User Ruslan Ermilov # Date 1375685759 -14400 # Node ID ec8594b9bf11de3599af15de8e73e41bf7a8b42c # Parent ae3fd1ca62e0942a6c83a37f30df386622462c80 Core: only resolve address families configured on the local system. 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. diff --git a/auto/unix b/auto/unix --- a/auto/unix +++ b/auto/unix @@ -788,7 +788,11 @@ ngx_feature_incs="#include #include " 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 diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -963,6 +963,7 @@ ngx_inet_resolve_host(ngx_pool_t *pool, 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";