From: Gregory P. Smith Date: Mon, 16 Nov 2015 02:19:10 +0000 (-0800) Subject: Fix issue #6973: When we know a subprocess.Popen process has died, do X-Git-Tag: v3.5.1rc1~40^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a0c9caad66f01328155177180df1c46fe7c62e57;p=thirdparty%2FPython%2Fcpython.git 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. --- diff --git a/Lib/subprocess.py b/Lib/subprocess.py index f11e538925bc..abf43e55861a 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1241,8 +1241,10 @@ class Popen(object): 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: @@ -1253,8 +1255,10 @@ class Popen(object): 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: @@ -1678,9 +1682,10 @@ class Popen(object): 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 index 881f0351e830..2d0755f931d5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -106,6 +106,10 @@ Core and Builtins 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 #25578: Fix (another) memory leak in SSLSocket.getpeercer(). - Issue #25590: In the Readline completer, only call getattr() once per