summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>1997-04-16 21:59:05 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>1997-04-16 21:59:05 +0000
commit6204bd7bec7872f882eef4a0571ec03657d989f9 (patch)
tree99a0bd14522906e868e7b7d983d494160d370ad8 /lib
parent1f04b3e0d3ffec2e05cf3c1bfa85ad87efe86f3a (diff)
Don't modify variables in the child since we vfork()'d to
get there (address space is shared between parent in child in traditional vfork(2)). From FreeBSD (dyson).
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/gen/popen.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/libc/gen/popen.c b/lib/libc/gen/popen.c
index 56a689806d5..2b667606941 100644
--- a/lib/libc/gen/popen.c
+++ b/lib/libc/gen/popen.c
@@ -35,7 +35,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: popen.c,v 1.3 1996/08/19 08:25:20 tholo Exp $";
+static char rcsid[] = "$OpenBSD: popen.c,v 1.4 1997/04/16 21:59:04 millert Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
@@ -86,9 +86,15 @@ popen(program, type)
/* NOTREACHED */
case 0: /* Child. */
if (*type == 'r') {
- if (pdes[1] != STDOUT_FILENO) {
- (void)dup2(pdes[1], STDOUT_FILENO);
- (void)close(pdes[1]);
+ /*
+ * We must NOT modify pdes, due to the
+ * semantics of vfork.
+ */
+ int tpdes1 = pdes[1];
+ if (tpdes1 != STDOUT_FILENO) {
+ (void)dup2(tpdes1, STDOUT_FILENO);
+ (void)close(tpdes1);
+ tpdes1 = STDOUT_FILENO;
}
(void) close(pdes[0]);
} else {