git: 9front

Download patch

ref: 0d89dc472f04c5817062a2a87c5b4a1a648fb6f5
parent: 6d571933b7d26e1c933e774d8d8475f83b565ef0
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Mon Oct 7 19:18:37 EDT 2013

exportfs: fix more filedescriptor leaks

just closing the pipe isnt enough, we have to
close all remaining file descriptors except sfd
before executing sub exportfs.

--- a/sys/src/cmd/exportfs/exportsrv.c
+++ b/sys/src/cmd/exportfs/exportsrv.c
@@ -578,8 +578,9 @@
 int
 openmount(int sfd)
 {
-	int p[2];
+	int p[2], fd, i, n;
 	char *arg[10], fdbuf[20], mbuf[20];
+	Dir *dir;
 
 	if(pipe(p) < 0)
 		return -1;
@@ -601,8 +602,19 @@
 
 	dup(p[0], 0);
 	dup(p[0], 1);
-	close(p[0]);
-	close(p[1]);
+
+	/* close all remaining file descriptors except sfd */
+	if((fd = open("/fd", OREAD)) < 0)
+		_exits("open /fd failed");
+	n = dirreadall(fd, &dir);
+	for(i=0; i<n; i++){
+		if(strstr(dir[i].name, "ctl"))
+			continue;
+		fd = atoi(dir[i].name);
+		if(fd > 2 && fd != sfd)
+			close(fd);
+	}
+	free(dir);
 
 	arg[0] = "exportfs";
 	snprint(fdbuf, sizeof fdbuf, "-S/fd/%d", sfd);
--