summaryrefslogtreecommitdiff
path: root/lib/pipe2.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2011-07-01 22:34:29 +0200
committerLudovic Courtès <ludo@gnu.org>2011-07-01 22:34:29 +0200
commit231c0e0e61fc4bdd69398e89084b7819f0420710 (patch)
tree097398cd884074bd1d62dfa592fbdd8eda0d9796 /lib/pipe2.c
parent97ec95b72873428f215a8a9892487c3a8435a754 (diff)
downloadguile-231c0e0e61fc4bdd69398e89084b7819f0420710.tar.gz
Update Gnulib to v0.0-5874-g7170ee0.
Diffstat (limited to 'lib/pipe2.c')
-rw-r--r--lib/pipe2.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/pipe2.c b/lib/pipe2.c
index e1884fadd..bb17264a3 100644
--- a/lib/pipe2.c
+++ b/lib/pipe2.c
@@ -40,6 +40,13 @@
int
pipe2 (int fd[2], int flags)
{
+ /* Mingw _pipe() corrupts fd on failure; also, if we succeed at
+ creating the pipe but later fail at changing fcntl, we want
+ to leave fd unchanged: http://austingroupbugs.net/view.php?id=467 */
+ int tmp[2];
+ tmp[0] = fd[0];
+ tmp[1] = fd[1];
+
#if HAVE_PIPE2
# undef pipe2
/* Try the system call first, if it exists. (We may be running with a glibc
@@ -71,7 +78,11 @@ pipe2 (int fd[2], int flags)
/* Native Woe32 API. */
if (_pipe (fd, 4096, flags & ~O_NONBLOCK) < 0)
- return -1;
+ {
+ fd[0] = tmp[0];
+ fd[1] = tmp[1];
+ return -1;
+ }
/* O_NONBLOCK handling.
On native Windows platforms, O_NONBLOCK is defined by gnulib. Use the
@@ -145,6 +156,8 @@ pipe2 (int fd[2], int flags)
int saved_errno = errno;
close (fd[0]);
close (fd[1]);
+ fd[0] = tmp[0];
+ fd[1] = tmp[1];
errno = saved_errno;
return -1;
}