return the new file descriptor from os.dup2 (closes bpo-32441) (#5041)

This commit is contained in:
Benjamin Peterson 2017-12-29 13:13:06 -08:00 committed by GitHub
parent 03220fdb26
commit bbdb17d19b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 50 additions and 32 deletions

View file

@ -7770,7 +7770,7 @@ os_dup_impl(PyObject *module, int fd)
/*[clinic input]
os.dup2
os.dup2 -> int
fd: int
fd2: int
inheritable: bool=True
@ -7778,9 +7778,9 @@ os.dup2
Duplicate file descriptor.
[clinic start generated code]*/
static PyObject *
static int
os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
/*[clinic end generated code: output=db832a2d872ccc5f input=76e96f511be0352f]*/
/*[clinic end generated code: output=bc059d34a73404d1 input=c3cddda8922b038d]*/
{
int res;
#if defined(HAVE_DUP3) && \
@ -7789,8 +7789,10 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
int dup3_works = -1;
#endif
if (fd < 0 || fd2 < 0)
return posix_error();
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
@ -7802,13 +7804,16 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
res = dup2(fd, fd2);
_Py_END_SUPPRESS_IPH
Py_END_ALLOW_THREADS
if (res < 0)
return posix_error();
if (res < 0) {
posix_error();
return -1;
}
res = fd2; // msvcrt dup2 returns 0 on success.
/* Character files like console cannot be make non-inheritable */
if (!inheritable && _Py_set_inheritable(fd2, 0, NULL) < 0) {
close(fd2);
return NULL;
return -1;
}
#elif defined(HAVE_FCNTL_H) && defined(F_DUP2FD_CLOEXEC)
@ -7818,8 +7823,10 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
else
res = dup2(fd, fd2);
Py_END_ALLOW_THREADS
if (res < 0)
return posix_error();
if (res < 0) {
posix_error();
return -1;
}
#else
@ -7831,8 +7838,10 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
if (res < 0) {
if (dup3_works == -1)
dup3_works = (errno != ENOSYS);
if (dup3_works)
return posix_error();
if (dup3_works) {
posix_error();
return -1;
}
}
}
@ -7842,12 +7851,14 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
Py_BEGIN_ALLOW_THREADS
res = dup2(fd, fd2);
Py_END_ALLOW_THREADS
if (res < 0)
return posix_error();
if (res < 0) {
posix_error();
return -1;
}
if (!inheritable && _Py_set_inheritable(fd2, 0, NULL) < 0) {
close(fd2);
return NULL;
return -1;
}
#ifdef HAVE_DUP3
}
@ -7855,7 +7866,7 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
#endif
Py_RETURN_NONE;
return res;
}