From 7c6971cff3de85e50c9fcda45eaa50d788dc86e5 Mon Sep 17 00:00:00 2001 From: Ruslan Ermilov Date: Mon, 5 Aug 2013 10:55:59 +0400 Subject: [PATCH] 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. --- auto/unix | 8 ++++++-- src/core/ngx_inet.c | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/auto/unix b/auto/unix index cd4209e7b..bc3c0f193 100755 --- 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 index 5dca72bc2..2b5c94c00 100644 --- 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_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";