diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2019-06-17 01:45:04 -0700 |
---|---|---|
committer | Victor Stinner <vstinner@redhat.com> | 2019-06-17 10:45:04 +0200 |
commit | 71589491ad0da27f57789b97354f6094a91e2eb3 (patch) | |
tree | 80e64e545573b4391deb32352eb88e86e35cc830 | |
parent | 351b0e793e35510e8cbbcbb455a1b9544e808cdd (diff) | |
download | cpython-git-71589491ad0da27f57789b97354f6094a91e2eb3.tar.gz |
bpo-37267: Do not check for FILE_TYPE_CHAR in os.dup() on Windows (GH-14051) (GH-14141)
On Windows, os.dup() no longer creates an inheritable fd when handling a
character file.
(cherry picked from commit 28fca0c422b425a6be43be31add0a5328c16b0b8)
Co-authored-by: Zackery Spytz <zspytz@gmail.com>
-rw-r--r-- | Lib/test/test_os.py | 9 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst | 2 | ||||
-rw-r--r-- | Python/fileutils.c | 17 |
3 files changed, 16 insertions, 12 deletions
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index fd9f70e30d..a917050400 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3240,6 +3240,15 @@ class FDInheritanceTests(unittest.TestCase): self.addCleanup(os.close, fd2) self.assertEqual(os.get_inheritable(fd2), False) + @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') + def test_dup_nul(self): + # os.dup() was creating inheritable fds for character files. + fd1 = os.open('NUL', os.O_RDONLY) + self.addCleanup(os.close, fd1) + fd2 = os.dup(fd1) + self.addCleanup(os.close, fd2) + self.assertFalse(os.get_inheritable(fd2)) + @unittest.skipUnless(hasattr(os, 'dup2'), "need os.dup2()") def test_dup2(self): fd = os.open(__file__, os.O_RDONLY) diff --git a/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst b/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst new file mode 100644 index 0000000000..a4dcfcde35 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst @@ -0,0 +1,2 @@ +On Windows, :func:`os.dup` no longer creates an inheritable fd when handling +a character file. diff --git a/Python/fileutils.c b/Python/fileutils.c index 5e71d37526..868fbf9103 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1659,7 +1659,6 @@ _Py_dup(int fd) { #ifdef MS_WINDOWS HANDLE handle; - DWORD ftype; #endif assert(PyGILState_Check()); @@ -1673,9 +1672,6 @@ _Py_dup(int fd) return -1; } - /* get the file type, ignore the error if it failed */ - ftype = GetFileType(handle); - Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH fd = dup(fd); @@ -1686,14 +1682,11 @@ _Py_dup(int fd) return -1; } - /* Character files like console cannot be make non-inheritable */ - if (ftype != FILE_TYPE_CHAR) { - if (_Py_set_inheritable(fd, 0, NULL) < 0) { - _Py_BEGIN_SUPPRESS_IPH - close(fd); - _Py_END_SUPPRESS_IPH - return -1; - } + if (_Py_set_inheritable(fd, 0, NULL) < 0) { + _Py_BEGIN_SUPPRESS_IPH + close(fd); + _Py_END_SUPPRESS_IPH + return -1; } #elif defined(HAVE_FCNTL_H) && defined(F_DUPFD_CLOEXEC) Py_BEGIN_ALLOW_THREADS |