mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-24 11:16:51 +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