diff --git a/Misc/NEWS.d/next/Library/2026-10-20-00-00-00.gh-issue-159739.1e4599.rst b/Misc/NEWS.d/next/Library/2026-10-20-00-00-00.gh-issue-159739.1e4599.rst new file mode 100644 index 00000000000000..3122ca29c7c49b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-10-20-00-00-00.gh-issue-159739.1e4599.rst @@ -0,0 +1,2 @@ +Fix off-by-one output buffer checks in the fallback implementation of +``getnameinfo()``. diff --git a/Modules/getnameinfo.c b/Modules/getnameinfo.c index 2a9034b833eceb..be8950d10fbba8 100644 --- a/Modules/getnameinfo.c +++ b/Modules/getnameinfo.c @@ -130,13 +130,13 @@ getnameinfo(const struct sockaddr *sa, size_t salen, char *host, size_t hostlen, /* what we should do? */ } else if (flags & NI_NUMERICSERV) { sprintf(numserv, "%d", ntohs(port)); - if (strlen(numserv) > servlen) + if (strlen(numserv) >= servlen) return ENI_MEMORY; strcpy(serv, numserv); } else { sp = getservbyport(port, (flags & NI_DGRAM) ? "udp" : "tcp"); if (sp) { - if (strlen(sp->s_name) > servlen) + if (strlen(sp->s_name) >= servlen) return ENI_MEMORY; strcpy(serv, sp->s_name); } else @@ -166,7 +166,7 @@ getnameinfo(const struct sockaddr *sa, size_t salen, char *host, size_t hostlen, if (inet_ntop(gni_afd->a_af, addr, numaddr, sizeof(numaddr)) == NULL) return ENI_SYSTEM; - if (strlen(numaddr) > hostlen) + if (strlen(numaddr) >= hostlen) return ENI_MEMORY; strcpy(host, numaddr); } else { @@ -181,7 +181,7 @@ getnameinfo(const struct sockaddr *sa, size_t salen, char *host, size_t hostlen, p = strchr(hp->h_name, '.'); if (p) *p = '\0'; } - if (strlen(hp->h_name) > hostlen) { + if (strlen(hp->h_name) >= hostlen) { #ifdef ENABLE_IPV6 freehostent(hp); #endif @@ -197,7 +197,7 @@ getnameinfo(const struct sockaddr *sa, size_t salen, char *host, size_t hostlen, if (inet_ntop(gni_afd->a_af, addr, numaddr, sizeof(numaddr)) == NULL) return ENI_NOHOSTNAME; - if (strlen(numaddr) > hostlen) + if (strlen(numaddr) >= hostlen) return ENI_MEMORY; strcpy(host, numaddr); }