From e5c01379a656bc1281cba2775c1098b55f2c6d5a Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 28 Apr 2011 16:31:26 +0200 Subject: [PATCH] Python: add fix for python bug 1731717 Signed-off-by: Stephan Raue --- ...6-101-fix_subprocess.wait_bug1731717.patch | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 packages/lang/Python/patches/Python-2.6.6-101-fix_subprocess.wait_bug1731717.patch diff --git a/packages/lang/Python/patches/Python-2.6.6-101-fix_subprocess.wait_bug1731717.patch b/packages/lang/Python/patches/Python-2.6.6-101-fix_subprocess.wait_bug1731717.patch new file mode 100644 index 0000000000..f9add293a0 --- /dev/null +++ b/packages/lang/Python/patches/Python-2.6.6-101-fix_subprocess.wait_bug1731717.patch @@ -0,0 +1,96 @@ + +# HG changeset patch +# User Gregory P. Smith +# 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 + ----------------- + +