gh-140734: fix off-by-one error when comparing to _SUN_PATH_MAX (#140903)

The limit includes a NULL terminator.
This commit is contained in:
Bénédikt Tran 2025-11-07 10:54:02 +01:00 committed by GitHub
parent c77441ef1d
commit 9a19900673
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 14 additions and 8 deletions

View file

@ -126,12 +126,14 @@ def is_abstract_socket_namespace(address):
# Function returning a temp directory which will be removed on exit
#
# Maximum length of a socket file path is usually between 92 and 108 [1],
# but Linux is known to use a size of 108 [2]. BSD-based systems usually
# use a size of 104 or 108 and Windows does not create AF_UNIX sockets.
# Maximum length of a NULL-terminated [1] socket file path is usually
# between 92 and 108 [2], but Linux is known to use a size of 108 [3].
# BSD-based systems usually use a size of 104 or 108 and Windows does
# not create AF_UNIX sockets.
#
# [1]: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_un.h.html
# [2]: https://man7.org/linux/man-pages/man7/unix.7.html.
# [1]: https://github.com/python/cpython/issues/140734
# [2]: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_un.h.html
# [3]: https://man7.org/linux/man-pages/man7/unix.7.html
if sys.platform == 'linux':
_SUN_PATH_MAX = 108
@ -171,11 +173,13 @@ def _get_base_temp_dir(tempfile):
# generated by tempfile._RandomNameSequence, which, by design,
# is 8 characters long.
#
# Thus, the length of socket filename will be:
# Thus, the socket file path length (without NULL terminator) will be:
#
# len(base_tempdir + '/pymp-XXXXXXXX' + '/sock-XXXXXXXX')
sun_path_len = len(base_tempdir) + 14 + 14
if sun_path_len <= _SUN_PATH_MAX:
# Strict inequality to account for the NULL terminator.
# See https://github.com/python/cpython/issues/140734.
if sun_path_len < _SUN_PATH_MAX:
return base_tempdir
# Fallback to the default system-wide temporary directory.
# This ignores user-defined environment variables.
@ -201,7 +205,7 @@ def _get_base_temp_dir(tempfile):
return base_tempdir
warn("Ignoring user-defined temporary directory: %s", base_tempdir)
# at most max(map(len, dirlist)) + 14 + 14 = 36 characters
assert len(base_system_tempdir) + 14 + 14 <= _SUN_PATH_MAX
assert len(base_system_tempdir) + 14 + 14 < _SUN_PATH_MAX
return base_system_tempdir
def get_temp_dir():