about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2022-08-26 14:57:52 -0400
committerRich Felker <dalias@aerifal.cx>2022-08-26 14:57:52 -0400
commita636fd630f70da01665c5cfaf01b8a657ef6c2fe (patch)
tree97b1fc183da78036001a173fd9c417ee326e8cc0 /src
parent996b6154b20184c3b08cce28eb01edb7f47e9413 (diff)
downloadmusl-a636fd630f70da01665c5cfaf01b8a657ef6c2fe.tar.gz
musl-a636fd630f70da01665c5cfaf01b8a657ef6c2fe.tar.xz
musl-a636fd630f70da01665c5cfaf01b8a657ef6c2fe.zip
dns: fail if ipv6 is disabled and resolv.conf has only v6 nameserves
if resolv.conf lists no nameservers at all, the default of 127.0.0.1
is used. however, another "no nameservers" case arises where the
system has ipv6 support disabled/configured-out and resolv.conf only
contains v6 nameservers. this caused the resolver to repeat socket
operations that will necessarily fail (sending to one or more
wrong-family addresses) while waiting for a timeout.

it would be contrary to configured intent to query 127.0.0.1 in this
case, but the current behavior is not conducive to diagnosing the
configuration problem. instead, fail immediately with EAI_SYSTEM and
errno==EAFNOSUPPORT so that the configuration error is reportable.
Diffstat (limited to 'src')
-rw-r--r--src/network/res_msend.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/network/res_msend.c b/src/network/res_msend.c
index 105bf598..9adaea13 100644
--- a/src/network/res_msend.c
+++ b/src/network/res_msend.c
@@ -72,6 +72,11 @@ int __res_msend_rc(int nqueries, const unsigned char *const *queries,
 
 	/* Handle case where system lacks IPv6 support */
 	if (fd < 0 && family == AF_INET6 && errno == EAFNOSUPPORT) {
+		for (i=0; i<nns && conf->ns[nns].family == AF_INET6; i++);
+		if (i==nns) {
+			pthread_setcancelstate(cs, 0);
+			return -1;
+		}
 		fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
 		family = AF_INET;
 		sl = sizeof sa.sin;