https://github.com/python/cpython/commit/01db9c3d73bed0c27ee50cdba492ccc0e958ae0d
commit: 01db9c3d73bed0c27ee50cdba492ccc0e958ae0d
branch: 3.15
author: Miss Islington (bot) <[email protected]>
committer: JelleZijlstra <[email protected]>
date: 2026-10-21T19:45:40Z
summary:

[3.15] gh-159739: Account for NUL terminators in fallback getnameinfo 
(GH-159991) (#160091)


(cherry picked from commit 69160f25dc5b920aecd3f19570de399dfd9fbf52)

Co-authored-by: Jelle Zijlstra <[email protected]>

files:
A Misc/NEWS.d/next/Library/2026-10-20-00-00-00.gh-issue-159739.1e4599.rst
M Modules/getnameinfo.c

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);
         }

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to