Skip to content

Commit

Permalink
gh-102179: Fix os.dup2 error reporting for negative fds (#102180)
Browse files Browse the repository at this point in the history
  • Loading branch information
izbyshev authored Mar 4, 2023
1 parent 705487c commit c2bd55d
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 5 deletions.
20 changes: 20 additions & 0 deletions Lib/test/test_os.py
Original file line number Diff line number Diff line change
Expand Up @@ -2221,6 +2221,26 @@ def test_closerange(self):
def test_dup2(self):
self.check(os.dup2, 20)

@unittest.skipUnless(hasattr(os, 'dup2'), 'test needs os.dup2()')
@unittest.skipIf(
support.is_emscripten,
"dup2() with negative fds is broken on Emscripten (see gh-102179)"
)
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)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix :func:`os.dup2` error message for negative fds.
5 changes: 0 additions & 5 deletions Modules/posixmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -9795,11 +9795,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.
Expand Down

0 comments on commit c2bd55d

Please sign in to comment.