Repository navigation
subprocess module does not check WIFSTOPPED on SIGCHLD #73521
Description
Activity
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-L1038The 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.
- addedstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directory
on Jan 20, 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.
- 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 The attached patch should fix it.
I want to incorporate a bug.py like regression test into test_subprocess.py.
test added.
- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Jan 22, 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/269296b2a047New 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/ed5255a61648New 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/4f5e7d018195Among 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.
----------------------------------------------------------------------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
Ran 260 tests in 102.297s
Also, http://buildbot.python.org/all/builders/x86%20Ubuntu%20Shared%203.x/builds/240/steps/test/logs/stdio
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/8e3d412f8e89thanks 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.
Of note, there's no need to actually cause a SIGSEGV to generate the signal.
The tests might be more clear to replace:
libc.printf(ctypes.c_char_p(0xdeadbeef))
with
os.kill(os.getpid(), signal.SIGSEGV)If you want crashes, look at the portable faulthandler._sigsegv() :-)
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'Fixed applied to subprocess32 in google/python-subprocess32@0f1958e
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:
bugs.python.org fields: