rc: flush environment variables (update /env) before fork
on races... normal forks will all share the /env environment but not the in memory variables of rc. so when we would normally fork whoever does an exec (flush) first will override what the values of the /env variables are, *independent* of the variables that where actually modified *in* the process. when we flush *before* fork, then at least both processes start out with marked clean in memory variables and the processes will flush only the things they actually change.
This commit is contained in:
parent
d8cd5d197d
commit
9a3a722dde
1 changed files with 9 additions and 0 deletions
|
@ -12,10 +12,12 @@ Xasync(void)
|
|||
int null = open("/dev/null", 0);
|
||||
int pid;
|
||||
char npid[10];
|
||||
|
||||
if(null<0){
|
||||
Xerror("Can't open /dev/null\n");
|
||||
return;
|
||||
}
|
||||
Updenv();
|
||||
switch(pid = rfork(RFFDG|RFPROC|RFNOTEG)){
|
||||
case -1:
|
||||
close(null);
|
||||
|
@ -45,10 +47,12 @@ Xpipe(void)
|
|||
int lfd = p->code[pc++].i;
|
||||
int rfd = p->code[pc++].i;
|
||||
int pfd[2];
|
||||
|
||||
if(pipe(pfd)<0){
|
||||
Xerror("can't get pipe");
|
||||
return;
|
||||
}
|
||||
Updenv();
|
||||
switch(forkid = fork()){
|
||||
case -1:
|
||||
Xerror("try again");
|
||||
|
@ -91,6 +95,7 @@ Xbackq(void)
|
|||
Xerror("can't make pipe");
|
||||
return;
|
||||
}
|
||||
Updenv();
|
||||
switch(pid = fork()){
|
||||
case -1:
|
||||
Xerror("try again");
|
||||
|
@ -152,6 +157,7 @@ Xpipefd(void)
|
|||
char name[40];
|
||||
int pfd[2];
|
||||
int sidefd, mainfd;
|
||||
|
||||
if(pipe(pfd)<0){
|
||||
Xerror("can't get pipe");
|
||||
return;
|
||||
|
@ -164,6 +170,7 @@ Xpipefd(void)
|
|||
sidefd = pfd[PRD];
|
||||
mainfd = pfd[PWR];
|
||||
}
|
||||
Updenv();
|
||||
switch(pid = fork()){
|
||||
case -1:
|
||||
Xerror("try again");
|
||||
|
@ -191,6 +198,8 @@ void
|
|||
Xsubshell(void)
|
||||
{
|
||||
int pid;
|
||||
|
||||
Updenv();
|
||||
switch(pid = fork()){
|
||||
case -1:
|
||||
Xerror("try again");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue