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 # 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], # Maximum length of a NULL-terminated [1] socket file path is usually
# but Linux is known to use a size of 108 [2]. BSD-based systems usually # between 92 and 108 [2], but Linux is known to use a size of 108 [3].
# use a size of 104 or 108 and Windows does not create AF_UNIX sockets. # 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 # [1]: https://github.com/python/cpython/issues/140734
# [2]: https://man7.org/linux/man-pages/man7/unix.7.html. # [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': if sys.platform == 'linux':
_SUN_PATH_MAX = 108 _SUN_PATH_MAX = 108
@ -171,11 +173,13 @@ def _get_base_temp_dir(tempfile):
# generated by tempfile._RandomNameSequence, which, by design, # generated by tempfile._RandomNameSequence, which, by design,
# is 8 characters long. # 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') # len(base_tempdir + '/pymp-XXXXXXXX' + '/sock-XXXXXXXX')
sun_path_len = len(base_tempdir) + 14 + 14 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 return base_tempdir
# Fallback to the default system-wide temporary directory. # Fallback to the default system-wide temporary directory.
# This ignores user-defined environment variables. # This ignores user-defined environment variables.
@ -201,7 +205,7 @@ def _get_base_temp_dir(tempfile):
return base_tempdir return base_tempdir
warn("Ignoring user-defined temporary directory: %s", base_tempdir) warn("Ignoring user-defined temporary directory: %s", base_tempdir)
# at most max(map(len, dirlist)) + 14 + 14 = 36 characters # 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 return base_system_tempdir
def get_temp_dir(): def get_temp_dir():

View file

@ -0,0 +1,2 @@
:mod:`multiprocessing`: fix off-by-one error when checking the length
of a temporary socket file path. Patch by Bénédikt Tran.