mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
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:
parent
c77441ef1d
commit
9a19900673
2 changed files with 14 additions and 8 deletions
|
|
@ -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():
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue