mirror of
https://github.com/python/cpython.git
synced 2024-11-27 11:55:13 +08:00
gh-102179: Fix os.dup2
error reporting for negative fds (#102180)
This commit is contained in:
parent
705487c655
commit
c2bd55d26f
@ -2221,6 +2221,26 @@ class TestInvalidFD(unittest.TestCase):
|
|||||||
def test_dup2(self):
|
def test_dup2(self):
|
||||||
self.check(os.dup2, 20)
|
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()')
|
@unittest.skipUnless(hasattr(os, 'fchmod'), 'test needs os.fchmod()')
|
||||||
def test_fchmod(self):
|
def test_fchmod(self):
|
||||||
self.check(os.fchmod, 0)
|
self.check(os.fchmod, 0)
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
Fix :func:`os.dup2` error message for negative fds.
|
@ -9795,11 +9795,6 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
|
|||||||
static int dup3_works = -1;
|
static int dup3_works = -1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (fd < 0 || fd2 < 0) {
|
|
||||||
posix_error();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* dup2() can fail with EINTR if the target FD is already open, because it
|
/* 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
|
* then has to be closed. See os_close_impl() for why we don't handle EINTR
|
||||||
* upon close(), and therefore below.
|
* upon close(), and therefore below.
|
||||||
|
Loading…
Reference in New Issue
Block a user