From 319bb17e1c1349ffb3c51c4b7654142050984772 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 15 Sep 2013 16:04:32 +0200 Subject: 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. --- sys/src/cmd/vnc/vncs.c | 15 ++++++++------- 1 file 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); -- cgit v1.2.3