X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fdup2.c;fp=lib%2Fdup2.c;h=a4422bf3b8c3aed35e4f5bdf2cf734e0a1ce6056;hb=a2016c1de6e4884f6c8ed5cc498f3bf821c25ca4;hp=140af1b9fb4d8e7d19404c74b827dd2a5acedd22;hpb=c7e61475680fa226bd9b8bdd469cd66914e630f5;p=debian%2Fgzip diff --git a/lib/dup2.c b/lib/dup2.c index 140af1b..a4422bf 100644 --- a/lib/dup2.c +++ b/lib/dup2.c @@ -1,7 +1,6 @@ /* Duplicate an open file descriptor to a specified file descriptor. - Copyright (C) 1999, 2004, 2005, 2006, 2007, 2009 Free Software - Foundation, Inc. + Copyright (C) 1999, 2004-2007, 2009-2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,7 +31,7 @@ # include #endif -#if REPLACE_DUP2 +#if HAVE_DUP2 # undef dup2 @@ -53,6 +52,13 @@ rpl_dup2 (int fd, int desired_fd) } return fd; } + /* Wine 1.0.1 return 0 when desired_fd is negative but not -1: + http://bugs.winehq.org/show_bug.cgi?id=21289 */ + if (desired_fd < 0) + { + errno = EBADF; + return -1; + } # endif result = dup2 (fd, desired_fd); # ifdef __linux__ @@ -70,14 +76,14 @@ rpl_dup2 (int fd, int desired_fd) /* Correct a cygwin 1.5.x errno value. */ else if (result == -1 && errno == EMFILE) errno = EBADF; -#if REPLACE_FCHDIR - if (fd != desired_fd && result == desired_fd) - result = _gl_register_dup (fd, desired_fd); -#endif +# if REPLACE_FCHDIR + if (fd != desired_fd && result != -1) + result = _gl_register_dup (fd, result); +# endif return result; } -#else /* !REPLACE_DUP2 */ +#else /* !HAVE_DUP2 */ /* On older platforms, dup2 did not exist. */ @@ -102,19 +108,21 @@ dupfd (int fd, int desired_fd) int dup2 (int fd, int desired_fd) { - int result; - if (fd == desired_fd) - return fcntl (fd, F_GETFL) < 0 ? -1 : fd; + int result = fcntl (fd, F_GETFL) < 0 ? -1 : fd; + if (result == -1 || fd == desired_fd) + return result; close (desired_fd); # ifdef F_DUPFD result = fcntl (fd, F_DUPFD, desired_fd); +# if REPLACE_FCHDIR + if (0 <= result) + result = _gl_register_dup (fd, result); +# endif # else result = dupfd (fd, desired_fd); # endif -#if REPLACE_FCHDIR - if (0 <= result) - result = _gl_register_dup (fd, desired_fd); -#endif + if (result == -1 && (errno == EMFILE || errno == EINVAL)) + errno = EBADF; return result; } -#endif /* !REPLACE_DUP2 */ +#endif /* !HAVE_DUP2 */