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 null = open("/dev/null", 0);
|
||||||
int pid;
|
int pid;
|
||||||
char npid[10];
|
char npid[10];
|
||||||
|
|
||||||
if(null<0){
|
if(null<0){
|
||||||
Xerror("Can't open /dev/null\n");
|
Xerror("Can't open /dev/null\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Updenv();
|
||||||
switch(pid = rfork(RFFDG|RFPROC|RFNOTEG)){
|
switch(pid = rfork(RFFDG|RFPROC|RFNOTEG)){
|
||||||
case -1:
|
case -1:
|
||||||
close(null);
|
close(null);
|
||||||
|
@ -45,10 +47,12 @@ Xpipe(void)
|
||||||
int lfd = p->code[pc++].i;
|
int lfd = p->code[pc++].i;
|
||||||
int rfd = p->code[pc++].i;
|
int rfd = p->code[pc++].i;
|
||||||
int pfd[2];
|
int pfd[2];
|
||||||
|
|
||||||
if(pipe(pfd)<0){
|
if(pipe(pfd)<0){
|
||||||
Xerror("can't get pipe");
|
Xerror("can't get pipe");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Updenv();
|
||||||
switch(forkid = fork()){
|
switch(forkid = fork()){
|
||||||
case -1:
|
case -1:
|
||||||
Xerror("try again");
|
Xerror("try again");
|
||||||
|
@ -91,6 +95,7 @@ Xbackq(void)
|
||||||
Xerror("can't make pipe");
|
Xerror("can't make pipe");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Updenv();
|
||||||
switch(pid = fork()){
|
switch(pid = fork()){
|
||||||
case -1:
|
case -1:
|
||||||
Xerror("try again");
|
Xerror("try again");
|
||||||
|
@ -152,6 +157,7 @@ Xpipefd(void)
|
||||||
char name[40];
|
char name[40];
|
||||||
int pfd[2];
|
int pfd[2];
|
||||||
int sidefd, mainfd;
|
int sidefd, mainfd;
|
||||||
|
|
||||||
if(pipe(pfd)<0){
|
if(pipe(pfd)<0){
|
||||||
Xerror("can't get pipe");
|
Xerror("can't get pipe");
|
||||||
return;
|
return;
|
||||||
|
@ -164,6 +170,7 @@ Xpipefd(void)
|
||||||
sidefd = pfd[PRD];
|
sidefd = pfd[PRD];
|
||||||
mainfd = pfd[PWR];
|
mainfd = pfd[PWR];
|
||||||
}
|
}
|
||||||
|
Updenv();
|
||||||
switch(pid = fork()){
|
switch(pid = fork()){
|
||||||
case -1:
|
case -1:
|
||||||
Xerror("try again");
|
Xerror("try again");
|
||||||
|
@ -191,6 +198,8 @@ void
|
||||||
Xsubshell(void)
|
Xsubshell(void)
|
||||||
{
|
{
|
||||||
int pid;
|
int pid;
|
||||||
|
|
||||||
|
Updenv();
|
||||||
switch(pid = fork()){
|
switch(pid = fork()){
|
||||||
case -1:
|
case -1:
|
||||||
Xerror("try again");
|
Xerror("try again");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue