summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-03-04 15:27:32 (GMT)
committerGitHub <noreply@github.com>2023-03-04 15:27:32 (GMT)
commit925ebfbfd22ac2ba3315ff427b9739d1e1907664 (patch)
treed100b3b3e65fc2b108bce9cf06fc63b2786bc9bc
parentfe36778968a0fdddada282fbd7e28e8ccd0debe0 (diff)
downloadcpython-925ebfbfd22ac2ba3315ff427b9739d1e1907664.zip
cpython-925ebfbfd22ac2ba3315ff427b9739d1e1907664.tar.gz
cpython-925ebfbfd22ac2ba3315ff427b9739d1e1907664.tar.bz2
[3.10] gh-102179: Fix `os.dup2` error reporting for negative fds (GH-102180) (#102419)
* 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>
-rw-r--r--Lib/test/test_os.py16
-rw-r--r--Misc/NEWS.d/next/Library/2023-02-23-15-06-01.gh-issue-102179.P6KQ4c.rst1
-rw-r--r--Modules/posixmodule.c5
3 files changed, 17 insertions, 5 deletions
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index 1243b57..6b443c4 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -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
index 0000000..f77493e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-02-23-15-06-01.gh-issue-102179.P6KQ4c.rst
@@ -0,0 +1 @@
+Fix :func:`os.dup2` error message for negative fds.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 62b81a1..c0421a9 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -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.