diff options
| author | Alex Rebert <alex@forallsecure.com> | 2020-01-22 18:28:31 -0500 |
|---|---|---|
| committer | Gregory P. Smith <greg@krypto.org> | 2020-01-22 15:28:31 -0800 |
| commit | d3ae95e1e945ed20297e1c38ba43a18b7a868ab6 (patch) | |
| tree | 788678084694d8dfcb2946d1ca594f1aba26f3ac /Lib/test/test_subprocess.py | |
| parent | 1f0f102dec506fd06f912b74dd2be64a7fba0d3f (diff) | |
| download | cpython-git-d3ae95e1e945ed20297e1c38ba43a18b7a868ab6.tar.gz | |
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.py | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index f1fb93455d..2bbdbaef84 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): |
