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:
cinap_lenrek 2013-08-20 23:56:15 +02:00
parent d8cd5d197d
commit 9a3a722dde

View file

@ -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");