diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-06-23 14:22:54 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-06-23 14:22:54 +0000 |
commit | c9a9a914af8b6961d99fd9e8a97aba05ba6eda5c (patch) | |
tree | 39ebf7c26a427d2debd828d3088cd30701637cdc /src | |
parent | c0d4d588c68154a68d5489deb2c67577eb1848c8 (diff) | |
download | gnunet-c9a9a914af8b6961d99fd9e8a97aba05ba6eda5c.tar.gz gnunet-c9a9a914af8b6961d99fd9e8a97aba05ba6eda5c.zip |
close pipes on exec
Diffstat (limited to 'src')
-rw-r--r-- | src/util/disk.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/util/disk.c b/src/util/disk.c index 60288bc5d..2474f0f2a 100644 --- a/src/util/disk.c +++ b/src/util/disk.c | |||
@@ -1663,27 +1663,28 @@ GNUNET_DISK_pipe (int blocking) | |||
1663 | } | 1663 | } |
1664 | p->fd[0]->fd = fd[0]; | 1664 | p->fd[0]->fd = fd[0]; |
1665 | p->fd[1]->fd = fd[1]; | 1665 | p->fd[1]->fd = fd[1]; |
1666 | ret = 0; | ||
1667 | flags = fcntl (fd[0], F_GETFL); | ||
1668 | flags |= FD_CLOEXEC; | ||
1666 | if (!blocking) | 1669 | if (!blocking) |
1670 | flags |= O_NONBLOCK; | ||
1671 | if (0 > fcntl (fd[0], F_SETFL, flags)) | ||
1672 | ret = -1; | ||
1673 | flags = fcntl (fd[1], F_GETFL); | ||
1674 | flags |= FD_CLOEXEC; | ||
1675 | if (!blocking) | ||
1676 | flags |= O_NONBLOCK; | ||
1677 | if (0 > fcntl (fd[1], F_SETFL, flags)) | ||
1678 | ret = -1; | ||
1679 | if (ret == -1) | ||
1667 | { | 1680 | { |
1668 | flags = fcntl (fd[0], F_GETFL); | 1681 | eno = errno; |
1669 | flags |= O_NONBLOCK; | 1682 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fcntl"); |
1670 | ret = fcntl (fd[0], F_SETFL, flags); | 1683 | GNUNET_break (0 == close (p->fd[0]->fd)); |
1671 | if (ret != -1) | 1684 | GNUNET_break (0 == close (p->fd[1]->fd)); |
1672 | { | 1685 | GNUNET_free (p); |
1673 | flags = fcntl (fd[1], F_GETFL); | 1686 | errno = eno; |
1674 | flags |= O_NONBLOCK; | 1687 | return NULL; |
1675 | ret = fcntl (fd[1], F_SETFL, flags); | ||
1676 | } | ||
1677 | if (ret == -1) | ||
1678 | { | ||
1679 | eno = errno; | ||
1680 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fcntl"); | ||
1681 | GNUNET_break (0 == close (p->fd[0]->fd)); | ||
1682 | GNUNET_break (0 == close (p->fd[1]->fd)); | ||
1683 | GNUNET_free (p); | ||
1684 | errno = eno; | ||
1685 | return NULL; | ||
1686 | } | ||
1687 | } | 1688 | } |
1688 | #else | 1689 | #else |
1689 | BOOL ret; | 1690 | BOOL ret; |