bpo-37549: os.dup() fails for standard streams on Windows 7 (GH-15389)
(cherry picked from commit 5be666010e
)
Co-authored-by: Zackery Spytz <zspytz@gmail.com>
This commit is contained in:
parent
761e5a7c7f
commit
3921d12174
|
@ -3476,6 +3476,11 @@ class FDInheritanceTests(unittest.TestCase):
|
||||||
self.addCleanup(os.close, fd2)
|
self.addCleanup(os.close, fd2)
|
||||||
self.assertEqual(os.get_inheritable(fd2), False)
|
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')
|
@unittest.skipUnless(sys.platform == 'win32', 'win32-specific test')
|
||||||
def test_dup_nul(self):
|
def test_dup_nul(self):
|
||||||
# os.dup() was creating inheritable fds for character files.
|
# os.dup() was creating inheritable fds for character files.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
:func:`os.dup` no longer fails for standard streams on Windows 7.
|
|
@ -1134,11 +1134,18 @@ set_inheritable(int fd, int inheritable, int raise, int *atomic_flag_works)
|
||||||
flags = HANDLE_FLAG_INHERIT;
|
flags = HANDLE_FLAG_INHERIT;
|
||||||
else
|
else
|
||||||
flags = 0;
|
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)
|
if (raise)
|
||||||
PyErr_SetFromWindowsErr(0);
|
PyErr_SetFromWindowsErr(0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#undef CONSOLE_PSEUDOHANDLE
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Reference in New Issue