You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
subprocess module does not check WIFSTOPPED on SIGCHLD #73521
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee='https://github.com/gpshead'closed_at=<Date2017-05-24.01:36:09.178>created_at=<Date2017-01-20.20:48:08.437>labels= ['type-bug', 'library']
title='subprocess module does not check WIFSTOPPED on SIGCHLD'updated_at=<Date2017-06-26.22:00:53.909>user='https://bugs.python.org/ZachRiggle'
The root cause is a lack of checking WIFSTOPPED and WSTOPSIG in the handler.
When a process elects into being ptraced via PTRACE_TRACEME, it is stopped on the SIGSEGV instead of terminating, allowing the user to attach a debugger before the kernel destroys the process.
This bug makes it impossible to wait on any process which crashes, which is set up to wait for a debugger.
When the attached proof-of-concept is executed, a RuntimeException is raised, which has a comment "Should never happen".
The issue isn't due to SIGCHLD, but rather following a waitpid() call. The code attempts to suss the exit code / reason for waitpid() returning, but does not check for WIFSTOPPED in its handler.
changed the title [-]Python 2.7 subprocess module does not check WIFSTOPPED on SIGCHLD[/-][+]subprocess module does not check WIFSTOPPED on SIGCHLD[/+]on Jan 22, 2017
======================================================================
ERROR: test_child_terminated_in_stopped_state (test.test_subprocess.POSIXProcessTestCase)
Test wait() behavior when waitpid returns WIFSTOPPED; bpo-29335.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/db3l/buildarea/3.6.bolen-tiger/build/Lib/test/test_subprocess.py", line 2514, in test_child_terminated_in_stopped_state
libc = ctypes.CDLL(libc_name)
File "/Users/db3l/buildarea/3.6.bolen-tiger/build/Lib/ctypes/__init__.py", line 348, in __init__self._handle = _dlopen(self._name, mode)
OSError: dlopen(libc..dylib, 6): image not found
New changeset 56bc3b7 by Gregory P. Smith in branch 'master': bpo-29335 - apply suggested test_subprocess simplifications from haypo and Zach: (bpo-1757) 56bc3b7
Activity
ZachRiggle commentedon Jan 20, 2017
The attached script hits some "This should never happen" code in the subprocess module.
These lines here:
https://github.com/python/cpython/blob/2.7/Lib/subprocess.py#L1036-L1038
The root cause is a lack of checking WIFSTOPPED and WSTOPSIG in the handler.
When a process elects into being ptraced via PTRACE_TRACEME, it is stopped on the SIGSEGV instead of terminating, allowing the user to attach a debugger before the kernel destroys the process.
This bug makes it impossible to wait on any process which crashes, which is set up to wait for a debugger.
ZachRiggle commentedon Jan 22, 2017
To further clarify the report:
When the attached proof-of-concept is executed, a RuntimeException is raised, which has a comment "Should never happen".
The issue isn't due to SIGCHLD, but rather following a waitpid() call. The code attempts to suss the exit code / reason for waitpid() returning, but does not check for WIFSTOPPED in its handler.
[-]Python 2.7 subprocess module does not check WIFSTOPPED on SIGCHLD[/-][+]subprocess module does not check WIFSTOPPED on SIGCHLD[/+]gpshead commentedon Jan 22, 2017
The attached patch should fix it.
I want to incorporate a bug.py like regression test into test_subprocess.py.
gpshead commentedon Jan 22, 2017
test added.
python-dev commentedon Jan 23, 2017
New changeset 269296b2a047 by Gregory P. Smith in branch '3.5':
Issue bpo-29335: Fix subprocess.Popen.wait() when the child process has
https://hg.python.org/cpython/rev/269296b2a047
New changeset ed5255a61648 by Gregory P. Smith in branch '3.6':
Issue bpo-29335: Fix subprocess.Popen.wait() when the child process has
https://hg.python.org/cpython/rev/ed5255a61648
New changeset 4f5e7d018195 by Gregory P. Smith in branch 'default':
Issue bpo-29335: Fix subprocess.Popen.wait() when the child process has
https://hg.python.org/cpython/rev/4f5e7d018195
ned-deily commentedon Jan 23, 2017
Among other buildbot failures:
http://buildbot.python.org/all/builders/x86%20Tiger%203.6/builds/142/steps/test/logs/stdio
======================================================================
ERROR: test_child_terminated_in_stopped_state (test.test_subprocess.POSIXProcessTestCase)
Test wait() behavior when waitpid returns WIFSTOPPED; bpo-29335.
----------------------------------------------------------------------
Ran 260 tests in 102.297s
Also, http://buildbot.python.org/all/builders/x86%20Ubuntu%20Shared%203.x/builds/240/steps/test/logs/stdio
python-dev commentedon Jan 23, 2017
New changeset 8e3d412f8e89 by Gregory P. Smith in branch '2.7':
Issue bpo-29335: Fix subprocess.Popen.wait() when the child process has
https://hg.python.org/cpython/rev/8e3d412f8e89
gpshead commentedon Jan 23, 2017
thanks Ned, I was awaiting interesting buildbot results. :)
fixed in 2.7 and 3.5 onwards. thanks for the report Zach.
not closing until I also apply the fix to the subprocess32 backport.
ZachRiggle commentedon Jan 23, 2017
Of note, there's no need to actually cause a SIGSEGV to generate the signal.
The tests might be more clear to replace:
with
vstinner commentedon Jan 23, 2017
If you want crashes, look at the portable faulthandler._sigsegv() :-)
ZachRiggle commentedon Jan 23, 2017
Neat, though that's not in the standard library.
The current logic for getting a handle to libc could also be simplified via ctypes.util.find_library (https://docs.python.org/3/library/ctypes.html#finding-shared-libraries).
Darwin:
>>> import ctypes.util >>> ctypes.util.find_library('c') '/usr/lib/libc.dylib' Linux: >>> import ctypes.util >>> ctypes.util.find_library('c') 'libc.so.6'gpshead commentedon May 23, 2017
New changeset 56bc3b7 by Gregory P. Smith in branch 'master':
bpo-29335 - apply suggested test_subprocess simplifications from haypo and Zach: (bpo-1757)
56bc3b7
gpshead commentedon May 24, 2017
Fixed applied to subprocess32 in google/python-subprocess32@0f1958e
vstinner commentedon Jun 26, 2017
New changeset cdee3f1 by Victor Stinner in branch 'master':
bpo-30764: test_subprocess uses SuppressCrashReport (bpo-2405)
cdee3f1
vstinner commentedon Jun 26, 2017
New changeset 849b062 by Victor Stinner in branch '3.5':
bpo-30764: test_subprocess uses SuppressCrashReport (bpo-2405) (bpo-2411)
849b062
vstinner commentedon Jun 26, 2017
New changeset 9ad50d9 by Victor Stinner in branch '3.6':
bpo-30764: test_subprocess uses SuppressCrashReport (bpo-2405) (bpo-2410)
9ad50d9
vstinner commentedon Jun 26, 2017
New changeset 2097b9e by Victor Stinner in branch '2.7':
[2.7] bpo-30764: test_subprocess uses SuppressCrashReport (bpo-2405) (bpo-2412)
2097b9e