From b4064b9213541bf597a025f76860b2b5b2f95749 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Wed, 21 Oct 2026 11:46:03 -0700 Subject: [PATCH] gh-159739: Account for NUL terminators in fallback getnameinfo (GH-159991) Backport to 3.15 and 3.14. (cherry picked from commit 69160f25dc5b920aecd3f19570de399dfd9fbf52) Co-authored-by: Jelle Zijlstra --- .../2026-10-20-00-00-00.gh-issue-159739.1e4599.rst | 2 ++ Modules/getnameinfo.c | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2026-10-20-00-00-00.gh-issue-159739.1e4599.rst 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); }