]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.10] gh-102179: Fix `os.dup2` error reporting for negative fds (GH-102180) (#102419)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sat, 4 Mar 2023 15:27:32 +0000 (07:27 -0800)
committerGitHub <noreply@github.com>
Sat, 4 Mar 2023 15:27:32 +0000 (20:57 +0530)
* gh-102179: Fix `os.dup2` error reporting for negative fds (GH-102180)
(cherry picked from commit c2bd55d26f8eb2850eb9f9026b5d7f0ed1420b65)

Co-authored-by: Alexey Izbyshev <izbyshev@ispras.ru>
Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
Lib/test/test_os.py
Misc/NEWS.d/next/Library/2023-02-23-15-06-01.gh-issue-102179.P6KQ4c.rst [new file with mode: 0644]
Modules/posixmodule.c

index 1243b575dcafd1a475916d524f62cc9537a11ffe..6b443c48f8fcb54618a680167bb5ba92b93bc212 100644 (file)
@@ -2143,6 +2143,22 @@ class TestInvalidFD(unittest.TestCase):
     def test_dup2(self):
         self.check(os.dup2, 20)
 
+    @unittest.skipUnless(hasattr(os, 'dup2'), 'test needs os.dup2()')
+    def test_dup2_negative_fd(self):
+        valid_fd = os.open(__file__, os.O_RDONLY)
+        self.addCleanup(os.close, valid_fd)
+        fds = [
+            valid_fd,
+            -1,
+            -2**31,
+        ]
+        for fd, fd2 in itertools.product(fds, repeat=2):
+            if fd != fd2:
+                with self.subTest(fd=fd, fd2=fd2):
+                    with self.assertRaises(OSError) as ctx:
+                        os.dup2(fd, fd2)
+                    self.assertEqual(ctx.exception.errno, errno.EBADF)
+
     @unittest.skipUnless(hasattr(os, 'fchmod'), 'test needs os.fchmod()')
     def test_fchmod(self):
         self.check(os.fchmod, 0)
diff --git a/Misc/NEWS.d/next/Library/2023-02-23-15-06-01.gh-issue-102179.P6KQ4c.rst b/Misc/NEWS.d/next/Library/2023-02-23-15-06-01.gh-issue-102179.P6KQ4c.rst
new file mode 100644 (file)
index 0000000..f77493e
--- /dev/null
@@ -0,0 +1 @@
+Fix :func:`os.dup2` error message for negative fds.
index 62b81a16e806293bc5dd03496208156df8b6ba19..c0421a94c17397bce33d5a0feaccc88b9885d6aa 100644 (file)
@@ -9282,11 +9282,6 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
     static int dup3_works = -1;
 #endif
 
-    if (fd < 0 || fd2 < 0) {
-        posix_error();
-        return -1;
-    }
-
     /* dup2() can fail with EINTR if the target FD is already open, because it
      * then has to be closed. See os_close_impl() for why we don't handle EINTR
      * upon close(), and therefore below.