ref: 6d571933b7d26e1c933e774d8d8475f83b565ef0
parent: 465341d7ea530b75a3ad7d2029b638f89a5c9dce
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sun Oct 6 00:42:46 EDT 2013
exportfs: fix openmount() rfork flags and filedescriptor leak, silence of on initstr error 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.
--- a/sys/src/cmd/exportfs/exportfs.c
+++ b/sys/src/cmd/exportfs/exportfs.c
@@ -288,7 +288,10 @@
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 @@
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);
}
--- a/sys/src/cmd/exportfs/exportsrv.c
+++ b/sys/src/cmd/exportfs/exportsrv.c
@@ -584,8 +584,10 @@
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 @@
break;
}
+ dup(p[0], 0);
+ dup(p[0], 1);
+ close(p[0]);
close(p[1]);
arg[0] = "exportfs";
@@ -606,10 +611,6 @@
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;
--
⑨