diff options
author | Zackery Spytz <zspytz@gmail.com> | 2019-08-23 18:38:41 (GMT) |
---|---|---|
committer | Steve Dower <steve.dower@python.org> | 2019-08-23 18:38:41 (GMT) |
commit | 5be666010e4df65dc4d831435cc92340ea369f94 (patch) | |
tree | a77c11ab56db4089d292ca9a4f968dd3628d5ad0 | |
parent | 8f080b09953a2d862de5c74edf414a54ea3dbea5 (diff) | |
download | cpython-5be666010e4df65dc4d831435cc92340ea369f94.zip cpython-5be666010e4df65dc4d831435cc92340ea369f94.tar.gz cpython-5be666010e4df65dc4d831435cc92340ea369f94.tar.bz2 |
bpo-37549: os.dup() fails for standard streams on Windows 7 (GH-15389)
-rw-r--r-- | Lib/test/test_os.py | 5 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Windows/2019-08-22-09-04-44.bpo-37549.TpKI3M.rst | 1 | ||||
-rw-r--r-- | Python/fileutils.c | 9 |
3 files changed, 14 insertions, 1 deletions
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 4285931..440cd6c 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3476,6 +3476,11 @@ class FDInheritanceTests(unittest.TestCase): self.addCleanup(os.close, fd2) self.assertEqual(os.get_inheritable(fd2), False) + def test_dup_standard_stream(self): + fd = os.dup(1) + self.addCleanup(os.close, fd) + self.assertGreater(fd, 0) + @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') def test_dup_nul(self): # os.dup() was creating inheritable fds for character files. diff --git a/Misc/NEWS.d/next/Windows/2019-08-22-09-04-44.bpo-37549.TpKI3M.rst b/Misc/NEWS.d/next/Windows/2019-08-22-09-04-44.bpo-37549.TpKI3M.rst new file mode 100644 index 0000000..5345da8 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-08-22-09-04-44.bpo-37549.TpKI3M.rst @@ -0,0 +1 @@ +:func:`os.dup` no longer fails for standard streams on Windows 7. diff --git a/Python/fileutils.c b/Python/fileutils.c index 36a3c99..0c05424 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1134,11 +1134,18 @@ set_inheritable(int fd, int inheritable, int raise, int *atomic_flag_works) flags = HANDLE_FLAG_INHERIT; else flags = 0; - if (!SetHandleInformation(handle, HANDLE_FLAG_INHERIT, flags)) { + + /* This check can be removed once support for Windows 7 ends. */ +#define CONSOLE_PSEUDOHANDLE(handle) (((ULONG_PTR)(handle) & 0x3) == 0x3 && \ + GetFileType(handle) == FILE_TYPE_CHAR) + + if (!CONSOLE_PSEUDOHANDLE(handle) && + !SetHandleInformation(handle, HANDLE_FLAG_INHERIT, flags)) { if (raise) PyErr_SetFromWindowsErr(0); return -1; } +#undef CONSOLE_PSEUDOHANDLE return 0; #else |