diff options
Diffstat (limited to 'libc/bionic/dup2.cpp')
-rw-r--r-- | libc/bionic/dup2.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/libc/bionic/dup2.cpp b/libc/bionic/dup2.cpp index 0b8632b..98c5646 100644 --- a/libc/bionic/dup2.cpp +++ b/libc/bionic/dup2.cpp @@ -26,8 +26,19 @@ * SUCH DAMAGE. */ +#include <fcntl.h> #include <unistd.h> int dup2(int old_fd, int new_fd) { + // If old_fd is equal to new_fd and a valid file descriptor, dup2 returns + // old_fd without closing it. This is not true of dup3, so we have to + // handle this case ourselves. + if (old_fd == new_fd) { + if (fcntl(old_fd, F_GETFD) == -1) { + return -1; + } + return old_fd; + } + return dup3(old_fd, new_fd, 0); } |