summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZackery Spytz <zspytz@gmail.com>2019-08-23 18:38:41 (GMT)
committerSteve Dower <steve.dower@python.org>2019-08-23 18:38:41 (GMT)
commit5be666010e4df65dc4d831435cc92340ea369f94 (patch)
treea77c11ab56db4089d292ca9a4f968dd3628d5ad0
parent8f080b09953a2d862de5c74edf414a54ea3dbea5 (diff)
downloadcpython-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.py5
-rw-r--r--Misc/NEWS.d/next/Windows/2019-08-22-09-04-44.bpo-37549.TpKI3M.rst1
-rw-r--r--Python/fileutils.c9
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