diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -222,6 +222,22 @@ def test_repl_stderr_flush_separate_stderr(self): self.check_repl_stderr_flush(True) + #@cpython_only + #@unittest.skipUnless(os.name == 'nt', 'requires Windows') + def testClosingStderr_issue19050(self): + # Run a Python subprocess interactively + with self.interactive_python(True) as p: + p.stdin.write(b'import os\n') + p.stdin.write(b'os.close(2)\n') + p.stdin.write(b'1/0') + for line in p.stdout: print(line) + p.stdin.write(b'import sys ; sys.exit(42)\n') + + print(p.returncode) + p.wait() + self.assertEqual(p.returncode, 42) + + def test_basic_script(self): with temp_dir() as script_dir: script_name = _make_test_script(script_dir, 'script') diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -10,6 +10,7 @@ from functools import wraps from test.support import TESTFN, check_warnings, run_unittest, make_bad_fd, cpython_only +from test import script_helper from collections import UserList from _io import FileIO as _FileIO diff --git a/Parser/myreadline.c b/Parser/myreadline.c --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -115,6 +115,11 @@ if (p == NULL) return NULL; + if (!_PyVerify_fd(fileno(sys_stdout)) || + !_PyVerify_fd(fileno(stderr))) { + PyMem_RawFree(p); + return NULL; + } fflush(sys_stdout); if (prompt) fprintf(stderr, "%s", prompt);