summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_subprocess.py
diff options
context:
space:
mode:
authorAlex Rebert <alex@forallsecure.com>2020-01-22 23:28:31 (GMT)
committerGregory P. Smith <greg@krypto.org>2020-01-22 23:28:31 (GMT)
commitd3ae95e1e945ed20297e1c38ba43a18b7a868ab6 (patch)
tree788678084694d8dfcb2946d1ca594f1aba26f3ac /Lib/test/test_subprocess.py
parent1f0f102dec506fd06f912b74dd2be64a7fba0d3f (diff)
downloadcpython-d3ae95e1e945ed20297e1c38ba43a18b7a868ab6.zip
cpython-d3ae95e1e945ed20297e1c38ba43a18b7a868ab6.tar.gz
cpython-d3ae95e1e945ed20297e1c38ba43a18b7a868ab6.tar.bz2
bpo-35182: fix communicate() crash after child closes its pipes (GH-17020) (GH-18117)
When communicate() is called in a loop, it crashes when the child process has already closed any piped standard stream, but still continues to be running Co-authored-by: Andriy Maletsky <andriy.maletsky@gmail.com>
Diffstat (limited to 'Lib/test/test_subprocess.py')
-rw-r--r--Lib/test/test_subprocess.py11
1 files changed, 11 insertions, 0 deletions
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index f1fb934..2bbdbae 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -3145,6 +3145,17 @@ class POSIXProcessTestCase(BaseTestCase):
# so Popen failed to read it and uses a default returncode instead.
self.assertIsNotNone(proc.returncode)
+ def test_communicate_repeated_call_after_stdout_close(self):
+ proc = subprocess.Popen([sys.executable, '-c',
+ 'import os, time; os.close(1), time.sleep(2)'],
+ stdout=subprocess.PIPE)
+ while True:
+ try:
+ proc.communicate(timeout=0.1)
+ return
+ except subprocess.TimeoutExpired:
+ pass
+
@unittest.skipUnless(mswindows, "Windows specific tests")
class Win32ProcessTestCase(BaseTestCase):