Fix the problem in popen that makes correct vfork semantics fail.

Specifically, popen modifies a variable "pdes[1]" in the child
in such a way that it breaks code in the parent (due to the address
space sharing.)
This commit is contained in:
dyson 1997-04-16 03:26:50 +00:00
parent 94dc06fdd4
commit a07e70af85

View File

@ -93,14 +93,19 @@ popen(command, type)
/* NOTREACHED */
case 0: /* Child. */
if (*type == 'r') {
if (pdes[1] != STDOUT_FILENO) {
(void)dup2(pdes[1], STDOUT_FILENO);
(void)close(pdes[1]);
pdes[1] = STDOUT_FILENO;
/*
* 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]);
if (twoway && (pdes[1] != STDIN_FILENO))
(void)dup2(pdes[1], STDIN_FILENO);
if (twoway && (tpdes1 != STDIN_FILENO))
(void)dup2(tpdes1, STDIN_FILENO);
} else {
if (pdes[0] != STDIN_FILENO) {
(void)dup2(pdes[0], STDIN_FILENO);