diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 1997-04-16 21:59:05 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 1997-04-16 21:59:05 +0000 |
commit | 6204bd7bec7872f882eef4a0571ec03657d989f9 (patch) | |
tree | 99a0bd14522906e868e7b7d983d494160d370ad8 /lib | |
parent | 1f04b3e0d3ffec2e05cf3c1bfa85ad87efe86f3a (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.c | 14 |
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 { |