From: Florian Obser Subject: gethostbyname(3) should always set ai_canonname To: tech Date: Tue, 20 Aug 2024 14:57:17 +0200 Consulting the Book of Armaments: | If nodename is not null, and if requested by the AI_CANONNAME flag, the | ai_canonname field of the first returned addrinfo structure shall point | to a null-terminated string containing the canonical name corresponding | to the input nodename; if the canonical name is not available, then | ai_canonname shall refer to the nodename argument or a string with the | same contents. | --- https://pubs.opengroup.org/onlinepubs/9799919799/functions/freeaddrinfo.html Our documentation also claims that ai_canonname is set: AI_CANONNAME If the AI_CANONNAME bit is set, a successful call to getaddrinfo() will return a NUL-terminated string containing the canonical name of the specified host name in the ai_canonname element of the first addrinfo structure returned. OK? (There is a check in addrinfo_add to see if the AI_CANONNAME flag is set.) diff --git lib/libc/asr/getaddrinfo_async.c lib/libc/asr/getaddrinfo_async.c index 23262f5163f..d5cf56cd0d7 100644 --- lib/libc/asr/getaddrinfo_async.c +++ lib/libc/asr/getaddrinfo_async.c @@ -280,7 +280,7 @@ getaddrinfo_async_run(struct asr_query *as, struct asr_result *ar) as->as.ai.hostname) == -1) continue; - if ((r = addrinfo_add(as, &sa.sa, NULL))) + if ((r = addrinfo_add(as, &sa.sa, as->as.ai.hostname))) ar->ar_gai_errno = r; break; } @@ -681,7 +681,7 @@ 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 : NULL; + c = res_hnok(buf) ? buf : as->as.ai.hostname; } else if (as->as.ai.hints.ai_flags & AI_FQDN) c = as->as.ai.fqdn; else -- In my defence, I have been left unsupervised.