https://github.com/python/cpython/commit/69160f25dc5b920aecd3f19570de399dfd9fbf52
commit: 69160f25dc5b920aecd3f19570de399dfd9fbf52
branch: main
author: Jelle Zijlstra <[email protected]>
committer: JelleZijlstra <[email protected]>
date: 2026-10-21T11:46:03-07:00
summary:
gh-159739: Account for NUL terminators in fallback getnameinfo (#159991)
Backport to 3.15 and 3.14.
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]