[Python-checkins] cpython (merge 3.5 -> default): Fix issue #6973: When we know a subprocess.Popen process has died, do

gregory.p.smith python-checkins at python.org
Sun Nov 15 21:31:56 EST 2015


https://hg.python.org/cpython/rev/e51c46d12ec1
changeset:   99148:e51c46d12ec1
parent:      99145:858cb1538531
parent:      99147:bc907c76f054
user:        Gregory P. Smith <greg at krypto.org>
date:        Sun Nov 15 18:31:34 2015 -0800
summary:
  Fix issue #6973: When we know a subprocess.Popen process has died, do
not allow the send_signal(), terminate(), or kill() methods to do
anything as they could potentially signal a different process.

files:
  Lib/subprocess.py |  19 ++++++++++++-------
  Misc/NEWS         |   4 ++++
  2 files changed, 16 insertions(+), 7 deletions(-)


diff --git a/Lib/subprocess.py b/Lib/subprocess.py
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -1333,8 +1333,10 @@
             return (stdout, stderr)
 
         def send_signal(self, sig):
-            """Send a signal to the process
-            """
+            """Send a signal to the process."""
+            # Don't signal a process that we know has already died.
+            if self.returncode is not None:
+                return
             if sig == signal.SIGTERM:
                 self.terminate()
             elif sig == signal.CTRL_C_EVENT:
@@ -1345,8 +1347,10 @@
                 raise ValueError("Unsupported signal: {}".format(sig))
 
         def terminate(self):
-            """Terminates the process
-            """
+            """Terminates the process."""
+            # Don't terminate a process that we know has already died.
+            if self.returncode is not None:
+                return
             try:
                 _winapi.TerminateProcess(self._handle, 1)
             except PermissionError:
@@ -1754,9 +1758,10 @@
 
 
         def send_signal(self, sig):
-            """Send a signal to the process
-            """
-            os.kill(self.pid, sig)
+            """Send a signal to the process."""
+            # Skip signalling a process that we know has already died.
+            if self.returncode is None:
+                os.kill(self.pid, sig)
 
         def terminate(self):
             """Terminate the process with SIGTERM
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -88,6 +88,10 @@
 Library
 -------
 
+- Issue #6973: When we know a subprocess.Popen process has died, do
+  not allow the send_signal(), terminate(), or kill() methods to do
+  anything as they could potentially signal a different process.
+
 - Issue #23883: Added missing APIs to __all__ to match the documented APIs
   for the following modules: csv, enum, ftplib, logging, optparse, threading
   and wave.  Also added a test.support.check__all__() helper.  Patches by

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list