]> git.lizzy.rs Git - plan9front.git/commitdiff
exportfs: fix openmount() rfork flags and filedescriptor leak, silence of on initstr...
authorcinap_lenrek <cinap_lenrek@gmx.de>
Sun, 6 Oct 2013 02:42:46 +0000 (04:42 +0200)
committercinap_lenrek <cinap_lenrek@gmx.de>
Sun, 6 Oct 2013 02:42:46 +0000 (04:42 +0200)
fork child exportfs with new rendezvous group.
fix missing close of pipe filedescriptors on error.
fix missing close of other end of pipe in child.

dont bark when we get eof on the first init string read.
this condition can happen when unmount opens and
immidiately closes a exported srv file.

sys/src/cmd/exportfs/exportfs.c
sys/src/cmd/exportfs/exportsrv.c

index b618369b4def5aa19b09ac8ace07d9ff55b9a3c7..0ac79edd02d4b47b0508dbfd840fe72a96ce00e0 100644 (file)
@@ -288,7 +288,10 @@ main(int argc, char **argv)
                fatal("open ack write");
 
        ini = initial;
-       if (readn(netfd, initial, sizeof(initial)) < sizeof(initial))
+       n = readn(netfd, initial, sizeof(initial));
+       if (n == 0)
+               fatal(nil);     /* port scan or spurious open/close on exported /srv file (unmount) */
+       if (n < sizeof(initial))
                fatal("can't read initial string: %r");
 
        if (memcmp(ini, "impo", 4) == 0) {
@@ -844,10 +847,10 @@ fatal(char *s, ...)
        for(m = Proclist; m; m = m->next)
                postnote(PNPROC, m->pid, "kill");
 
-       DEBUG(DFD, "%s\n", buf);
-       if (s) 
+       if (s) {
+               DEBUG(DFD, "%s\n", buf);
                sysfatal("%s", buf);    /* caution: buf could contain '%' */
-       else
+       else
                exits(nil);
 }
 
index 7e8d836ffa38d05e217b1c02e054e98858c4b3d6..ea2d77ab83789f6e045de7f7fb2ba2996459e13f 100644 (file)
@@ -584,8 +584,10 @@ openmount(int sfd)
        if(pipe(p) < 0)
                return -1;
 
-       switch(rfork(RFPROC|RFMEM|RFNOWAIT|RFNAMEG|RFFDG)){
+       switch(rfork(RFPROC|RFMEM|RFNOWAIT|RFNAMEG|RFFDG|RFREND)){
        case -1:
+               close(p[0]);
+               close(p[1]);
                return -1;
 
        default:
@@ -597,6 +599,9 @@ openmount(int sfd)
                break;
        }
 
+       dup(p[0], 0);
+       dup(p[0], 1);
+       close(p[0]);
        close(p[1]);
 
        arg[0] = "exportfs";
@@ -606,10 +611,6 @@ openmount(int sfd)
        arg[2] = mbuf;
        arg[3] = nil;
 
-       close(0);
-       close(1);
-       dup(p[0], 0);
-       dup(p[0], 1);
        exec("/bin/exportfs", arg);
        _exits("whoops: exec failed");  
        return -1;