mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 13:16:41 +00:00
Python: add fix for python bug 1731717
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
4a8568d236
commit
e5c01379a6
@ -0,0 +1,96 @@
|
|||||||
|
|
||||||
|
# HG changeset patch
|
||||||
|
# User Gregory P. Smith <greg@mad-scientist.com>
|
||||||
|
# Date 1292338973 0
|
||||||
|
# Node ID 072ee3f743c21f3770ccf13ad48e10a18048063f
|
||||||
|
# Parent 8ccf58b0a5da776006d7fc98d9e6975c82265a78
|
||||||
|
Merged revisions 87233 via svnmerge from
|
||||||
|
svn+ssh://pythondev@svn.python.org/python/branches/py3k
|
||||||
|
|
||||||
|
........
|
||||||
|
r87233 | gregory.p.smith | 2010-12-14 06:38:00 -0800 (Tue, 14 Dec 2010) | 4 lines
|
||||||
|
|
||||||
|
Issue #1731717: Fixed the problem where subprocess.wait() could cause an
|
||||||
|
OSError exception when The OS had been told to ignore SIGCLD in our process
|
||||||
|
or otherwise not wait for exiting child processes.
|
||||||
|
........
|
||||||
|
|
||||||
|
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
|
||||||
|
--- a/Lib/subprocess.py
|
||||||
|
+++ b/Lib/subprocess.py
|
||||||
|
@@ -1194,7 +1194,11 @@ class Popen(object):
|
||||||
|
os.close(errpipe_read)
|
||||||
|
|
||||||
|
if data != "":
|
||||||
|
- _eintr_retry_call(os.waitpid, self.pid, 0)
|
||||||
|
+ try:
|
||||||
|
+ _eintr_retry_call(os.waitpid, self.pid, 0)
|
||||||
|
+ except OSError as e:
|
||||||
|
+ if e.errno != errno.ECHILD:
|
||||||
|
+ raise
|
||||||
|
child_exception = pickle.loads(data)
|
||||||
|
for fd in (p2cwrite, c2pread, errread):
|
||||||
|
if fd is not None:
|
||||||
|
@@ -1240,7 +1244,15 @@ class Popen(object):
|
||||||
|
"""Wait for child process to terminate. Returns returncode
|
||||||
|
attribute."""
|
||||||
|
if self.returncode is None:
|
||||||
|
- pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
|
||||||
|
+ try:
|
||||||
|
+ pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
|
||||||
|
+ except OSError as e:
|
||||||
|
+ if e.errno != errno.ECHILD:
|
||||||
|
+ raise
|
||||||
|
+ # This happens if SIGCLD is set to be ignored or waiting
|
||||||
|
+ # for child processes has otherwise been disabled for our
|
||||||
|
+ # process. This child is dead, we can't get the status.
|
||||||
|
+ sts = 0
|
||||||
|
self._handle_exitstatus(sts)
|
||||||
|
return self.returncode
|
||||||
|
|
||||||
|
diff --git a/Lib/test/subprocessdata/sigchild_ignore.py b/Lib/test/subprocessdata/sigchild_ignore.py
|
||||||
|
new file mode 100644
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Lib/test/subprocessdata/sigchild_ignore.py
|
||||||
|
@@ -0,0 +1,6 @@
|
||||||
|
+import signal, subprocess, sys
|
||||||
|
+# On Linux this causes os.waitpid to fail with OSError as the OS has already
|
||||||
|
+# reaped our child process. The wait() passing the OSError on to the caller
|
||||||
|
+# and causing us to exit with an error is what we are testing against.
|
||||||
|
+signal.signal(signal.SIGCLD, signal.SIG_IGN)
|
||||||
|
+subprocess.Popen([sys.executable, '-c', 'print("albatross")']).wait()
|
||||||
|
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
|
||||||
|
--- a/Lib/test/test_subprocess.py
|
||||||
|
+++ b/Lib/test/test_subprocess.py
|
||||||
|
@@ -778,6 +778,16 @@ class POSIXProcessTestCase(BaseTestCase)
|
||||||
|
self.assertStderrEqual(stderr, '')
|
||||||
|
self.assertEqual(p.wait(), -signal.SIGTERM)
|
||||||
|
|
||||||
|
+ def test_wait_when_sigchild_ignored(self):
|
||||||
|
+ # NOTE: sigchild_ignore.py may not be an effective test on all OSes.
|
||||||
|
+ sigchild_ignore = test_support.findfile("sigchild_ignore.py",
|
||||||
|
+ subdir="subprocessdata")
|
||||||
|
+ p = subprocess.Popen([sys.executable, sigchild_ignore],
|
||||||
|
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
+ stdout, stderr = p.communicate()
|
||||||
|
+ self.assertEqual(0, p.returncode, "sigchild_ignore.py exited"
|
||||||
|
+ " non-zero with this error:\n%s" % stderr)
|
||||||
|
+
|
||||||
|
|
||||||
|
@unittest.skipUnless(mswindows, "Windows specific tests")
|
||||||
|
class Win32ProcessTestCase(BaseTestCase):
|
||||||
|
diff --git a/Misc/NEWS b/Misc/NEWS
|
||||||
|
--- a/Misc/NEWS
|
||||||
|
+++ b/Misc/NEWS
|
||||||
|
@@ -34,6 +34,10 @@ Library
|
||||||
|
|
||||||
|
- Issue #10464: netrc now correctly handles lines with embedded '#' characters.
|
||||||
|
|
||||||
|
+- Issue #1731717: Fixed the problem where subprocess.wait() could cause an
|
||||||
|
+ OSError exception when The OS had been told to ignore SIGCLD in our process
|
||||||
|
+ or otherwise not wait for exiting child processes.
|
||||||
|
+
|
||||||
|
Extension Modules
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user