From: Florian Obser Subject: Skip aliases that are not valid hostnames in gethostbyname(3). To: tech Date: Sat, 11 Apr 2026 18:05:25 +0200 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? (Shouldn't have any risk for making release, but it's also not important, I'm just chipping away at a larger diff that will not make release). 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.