Index | Thread | Search

From:
Florian Obser <florian@openbsd.org>
Subject:
asr: reject zero-length aliases / canon name in gethostbyname(3) / getaddrinfo(3).
To:
tech <tech@openbsd.org>
Date:
Sun, 21 Jun 2026 22:06:54 +0200

Download raw body.

Thread
An empty string is arguably not a correct hostname (even though
res_hnok accepts it). More worrisome though is software not expecting
this and making mistakes. In practice this cannot happen unless the
resolver lies to us.

OK?

diff --git lib/libc/asr/getaddrinfo_async.c lib/libc/asr/getaddrinfo_async.c
index b24c1e39fef..a4740b70a52 100644
--- lib/libc/asr/getaddrinfo_async.c
+++ lib/libc/asr/getaddrinfo_async.c
@@ -678,7 +678,10 @@ addrinfo_from_pkt(struct asr_query *as, char *pkt, size_t pktlen)
 		if (as->as.ai.hints.ai_flags & AI_CANONNAME) {
 			_asr_strdname(rr.rr_dname, buf, sizeof buf);
 			buf[strlen(buf) - 1] = '\0';
-			c = res_hnok(buf) ? buf : as->as.ai.hostname;
+			if (buf[0] != '\0' && res_hnok(buf))
+				c = buf;
+			else
+				c = as->as.ai.hostname;
 		} else if (as->as.ai.hints.ai_flags & AI_FQDN)
 			c = as->as.ai.fqdn;
 		else
diff --git lib/libc/asr/gethostnamadr_async.c lib/libc/asr/gethostnamadr_async.c
index 0b9a6ab0641..b00497f3ae7 100644
--- lib/libc/asr/gethostnamadr_async.c
+++ lib/libc/asr/gethostnamadr_async.c
@@ -595,7 +595,7 @@ hostent_set_cname(struct hostent_ext *h, const char *name, int isdname)
 	if (isdname) {
 		_asr_strdname(name, buf, sizeof buf);
 		buf[strlen(buf) - 1] = '\0';
-		if (!res_hnok(buf))
+		if (buf[0] == '\0' || !res_hnok(buf))
 			return (-1);
 		name = buf;
 	}
@@ -625,7 +625,7 @@ hostent_add_alias(struct hostent_ext *h, const char *name, int isdname)
 	if (isdname) {
 		_asr_strdname(name, buf, sizeof buf);
 		buf[strlen(buf)-1] = '\0';
-		if (!res_hnok(buf))
+		if (buf[0] == '\0' || !res_hnok(buf))
 			return;
 		name = buf;
 	}


-- 
In my defence, I have been left unsupervised.