Skip to content

Commit c6a3bea

Browse files
committed
gh-144503: Pass sys.argv as separate command line arguments.
The maximum length of a single command line argument is more restricted than the total size of all command line arguments together.
1 parent 67ddba9 commit c6a3bea

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

Lib/multiprocessing/forkserver.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,6 @@ def ensure_running(self):
172172
main_kws['sys_path'] = data['sys_path']
173173
if 'init_main_from_path' in data:
174174
main_kws['main_path'] = data['init_main_from_path']
175-
if 'sys_argv' in data:
176-
main_kws['sys_argv'] = data['sys_argv']
177175
if self._preload_on_error != 'ignore':
178176
main_kws['on_error'] = self._preload_on_error
179177

@@ -197,6 +195,8 @@ def ensure_running(self):
197195
exe = spawn.get_executable()
198196
args = [exe] + util._args_from_interpreter_flags()
199197
args += ['-c', cmd]
198+
if self._preload_modules:
199+
args += data["sys_argv"]
200200
pid = util.spawnv_passfds(exe, args, fds_to_pass)
201201
except:
202202
os.close(alive_w)
@@ -282,7 +282,7 @@ def _handle_preload(preload, main_path=None, sys_path=None, sys_argv=None,
282282

283283

284284
def main(listener_fd, alive_r, preload, main_path=None, sys_path=None,
285-
*, sys_argv=None, authkey_r=None, on_error='ignore'):
285+
*, authkey_r=None, on_error='ignore'):
286286
"""Run forkserver."""
287287
if authkey_r is not None:
288288
try:
@@ -293,6 +293,11 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None,
293293
else:
294294
authkey = b''
295295

296+
if preload:
297+
sys_argv = sys.argv[1:]
298+
else:
299+
sys_argv = None
300+
296301
_handle_preload(preload, main_path, sys_path, sys_argv, on_error)
297302

298303
util._close_stdin()

Lib/test/_test_multiprocessing.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import collections.abc
2121
import socket
2222
import random
23+
import resource
2324
import logging
2425
import shutil
2526
import subprocess
@@ -7106,6 +7107,28 @@ def test_preload_main_sys_argv(self):
71067107
'',
71077108
])
71087109

7110+
def test_preload_main_sys_argv_limits(self):
7111+
# gh-144503: Check that sys.argv is set before __main__ is pre-loaded
7112+
if multiprocessing.get_start_method() != "forkserver":
7113+
self.skipTest("forkserver specific test")
7114+
7115+
max_str_arglen = 32 * resource.getpagesize()
7116+
argv = ["a" * (max_str_arglen - 1), "b"]
7117+
name = os.path.join(os.path.dirname(__file__), 'mp_preload_sysargv.py')
7118+
_, out, err = test.support.script_helper.assert_python_ok(
7119+
name, *argv)
7120+
self.assertEqual(err, b'')
7121+
7122+
out = out.decode().split("\n")
7123+
expected_argv = str(argv)
7124+
self.assertEqual(out, [
7125+
f"module:{expected_argv}",
7126+
f"fun:{expected_argv}",
7127+
f"module:{expected_argv}",
7128+
f"fun:{expected_argv}",
7129+
'',
7130+
])
7131+
71097132
#
71107133
# Mixins
71117134
#

0 commit comments

Comments
 (0)