Re: Skip aliases that are not valid hostnames in gethostbyname(3).

Florian Obser <[email protected]>
Newsgroups gmane.os.openbsd.tech
Message-ID <[email protected]>
On 2026-04-11 18:05 +02, Florian Obser <[email protected]> wrote:
> Consider the following CNAME chain:
>
> chain7.narrans.de.      60      IN      CNAME   chain\007.tlakh.xyz.
> chain\007.tlakh.xyz.    60      IN      CNAME   chain.sha256.net.
> chain.sha256.net.       60      IN      CNAME   sha256.net.
> sha256.net.             60      IN      A       213.239.192.17
>
> gethostbyname(3) would fail the query when it encounters
> chain\007.tlakh.xyz. and tries to add it to h_aliases member of struct
> hostent because it's not a valid hostname. This in turn would fail the
> whole query.
>
> With this, resolution succeeds and we get an alias list of
> "chain0.narrans.de chain.sha256.net".
>
> hostent_add_alias() can no longer fail, so make it void.
>
> Noticed by dgl while we were working on something else.
>
> OK?

going through diffs that didn't make release. OK?

diff --git lib/libc/asr/gethostnamadr_async.c lib/libc/asr/gethostnamadr_async.c
index 1b0ab9d59e3..0b9a6ab0641 100644
--- lib/libc/asr/gethostnamadr_async.c
+++ lib/libc/asr/gethostnamadr_async.c
@@ -55,7 +55,7 @@ struct netent_ext {
 static int gethostnamadr_async_run(struct asr_query *, struct asr_result *);
 static struct hostent_ext *hostent_alloc(int);
 static int hostent_set_cname(struct hostent_ext *, const char *, int);
-static int hostent_add_alias(struct hostent_ext *, const char *, int);
+static void hostent_add_alias(struct hostent_ext *, const char *, int);
 static int hostent_add_addr(struct hostent_ext *, const void *, size_t);
 static struct hostent_ext *hostent_from_addr(int, const char *, const char *);
 static struct hostent_ext *hostent_file_match(FILE *, int, int, const char *,
@@ -477,8 +477,7 @@ found:
 	if (hostent_set_cname(h, tokens[1], 0) == -1)
 		goto fail;
 	for (i = 2; i < n; i ++)
-		if (hostent_add_alias(h, tokens[i], 0) == -1)
-			goto fail;
+		hostent_add_alias(h, tokens[i], 0);
 	if (hostent_add_addr(h, addr, h->h.h_length) == -1)
 		goto fail;
 	return (h);
@@ -517,8 +516,7 @@ hostent_from_packet(int reqtype, int family, char *pkt, size_t pktlen)
 
 		case T_CNAME:
 			if (reqtype == ASR_GETHOSTBYNAME) {
-				if (hostent_add_alias(h, rr.rr_dname, 1) == -1)
-					goto fail;
+				hostent_add_alias(h, rr.rr_dname, 1);
 			} else {
 				if (strcasecmp(rr.rr_dname, dname) == 0)
 					strlcpy(dname, rr.rr.cname.cname,
@@ -612,7 +610,7 @@ hostent_set_cname(struct hostent_ext *h, const char *name, int isdname)
 	return (0);
 }
 
-static int
+static void
 hostent_add_alias(struct hostent_ext *h, const char *name, int isdname)
 {
 	char	buf[MAXDNAME];
@@ -622,24 +620,23 @@ hostent_add_alias(struct hostent_ext *h, const char *name, int isdname)
 		if (h->aliases[i] == NULL)
 			break;
 	if (i == MAXALIASES)
-		return (0);
+		return;
 
 	if (isdname) {
 		_asr_strdname(name, buf, sizeof buf);
 		buf[strlen(buf)-1] = '\0';
 		if (!res_hnok(buf))
-			return (-1);
+			return;
 		name = buf;
 	}
 
 	n = strlen(name) + 1;
 	if (h->pos + n >= h->end)
-		return (0);
+		return;
 
 	h->aliases[i] = h->pos;
 	memmove(h->pos, name, n);
 	h->pos += n;
-	return (0);
 }
 
 static int


-- 
In my defence, I have been left unsupervised.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.