diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-09-15 16:04:32 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-09-15 16:04:32 +0200 |
commit | 319bb17e1c1349ffb3c51c4b7654142050984772 (patch) | |
tree | 1578e0e908f46fe62a3049755e55352a4fe6a416 /sys/src/cmd/vnc/vncs.c | |
parent | e220636fd305f378a27cfa485d39e7588d6dc03c (diff) |
vncs: fix cmdpid fork bug
we cannot do:
cmdpid = rfork(... RFMEM);
because cmdpid is a global variable in the data segment
and hence shared between parent and child process. use a
temporary variable on the stack.
Diffstat (limited to 'sys/src/cmd/vnc/vncs.c')
-rw-r--r-- | sys/src/cmd/vnc/vncs.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/sys/src/cmd/vnc/vncs.c b/sys/src/cmd/vnc/vncs.c index f191db7e2..7de384de4 100644 --- a/sys/src/cmd/vnc/vncs.c +++ b/sys/src/cmd/vnc/vncs.c @@ -87,7 +87,7 @@ usage(void) void main(int argc, char **argv) { - int altnet, baseport, cfd, display, exnum, fd, h, killing, w; + int altnet, baseport, cfd, display, exnum, fd, pid, h, killing, w; char adir[NETPATHLEN], ldir[NETPATHLEN]; char net[NETPATHLEN], *p; char *kbdfs[] = { "/bin/aux/kbdfs", "-dq", nil }; @@ -197,8 +197,8 @@ main(int argc, char **argv) sysfatal("mounter: %r"); close(fd); - cmdpid = rfork(RFPROC|RFMEM|RFFDG|RFNOTEG); - switch(cmdpid){ + pid = rfork(RFPROC|RFMEM|RFFDG|RFNOTEG); + switch(pid){ case -1: sysfatal("rfork: %r"); break; @@ -211,8 +211,8 @@ main(int argc, char **argv) open("/dev/cons", OWRITE); /* start and mount kbdfs */ - cmdpid = rfork(RFPROC|RFMEM|RFFDG|RFREND); - switch(cmdpid){ + pid = rfork(RFPROC|RFMEM|RFFDG|RFREND); + switch(pid){ case -1: sysfatal("rfork: %r"); break; @@ -221,9 +221,9 @@ main(int argc, char **argv) fprint(2, "exec %s: %r\n", kbdfs[0]); _exits("kbdfs"); } - if(waitpid() != cmdpid){ + if(waitpid() != pid){ rendezvous(&kbdin, nil); - sysfatal("%s: %r", kbdfs[0]); + sysfatal("waitpid: %s: %r", kbdfs[0]); } rendezvous(&kbdin, nil); @@ -240,6 +240,7 @@ main(int argc, char **argv) fprint(2, "exec %s: %r\n", argv[0]); _exits(nil); } + cmdpid = pid; /* wait for kbdfs to get mounted */ rendezvous(&kbdin, nil); |