PERFORCE change 173944 for review

Robert Watson rwatson at FreeBSD.org
Sat Jan 30 11:20:21 UTC 2010


http://p4web.freebsd.org/chv.cgi?CH=173944

Change 173944 by rwatson at rwatson_vimage_client on 2010/01/30 11:20:14

	Only set up a file descriptor list (and its corresponding POSIX
	shared memory segment + environmental variable) if we're going to
	use it.
	
	Update copyright year.

Affected files ...

.. //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_host.c#5 edit

Differences ...

==== //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_host.c#5 (text+ko) ====

@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2009 Robert N. M. Watson
+ * Copyright (c) 2009-2010 Robert N. M. Watson
  * All rights reserved.
  *
  * WARNING: THIS IS EXPERIMENTAL SECURITY SOFTWARE THAT MUST NOT BE RELIED
@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_host.c#4 $
+ * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_host.c#5 $
  */
 
 #include <sys/param.h>
@@ -152,31 +152,35 @@
 {
 	int *fd_array, fdcount;
 	struct sbuf *sbufp;
-	int shmfd, fdlistsize;
+	int shmfd = -1;
+	size_t fdlistsize;
 	void *shm;
 	char fdliststr[8];
 	u_int i;
 
+	/*
+	 * Create an anonymous shared memory segment for the FD list.
+	 */
+	if (fds != NULL) {
+		shmfd = shm_open(SHM_ANON, O_RDWR, 0600);
+		if (shmfd < 0)
+			return;
+		fdlistsize = lc_fdlist_size(fds);
+		if (ftruncate(shmfd, fdlistsize) < 0)
+			return;
 
-	/* create an anonymous shared memory segment for the FD list */
-	shmfd = shm_open(SHM_ANON, O_RDWR, 0600);
-	if (shmfd < 0) return;
-
-	fdlistsize = lc_fdlist_size(fds);
-	if (ftruncate(shmfd, fdlistsize) < 0) return;
+		/*
+		 * Map it and copy the list.
+		 */
+		shm = mmap(NULL, fdlistsize, PROT_READ | PROT_WRITE,
+		    MAP_NOSYNC | MAP_SHARED, shmfd, 0);
+		if (shm == MAP_FAILED)
+			return;
+		memcpy(shm, fds, fdlistsize);
+		if (munmap(shm, fdlistsize))
+			return;
+	}
 
-
-	/* map it and copy the list */
-	shm = mmap(NULL, fdlistsize, PROT_READ | PROT_WRITE,
-	           MAP_NOSYNC | MAP_SHARED, shmfd, 0);
-
-	if (shm == MAP_FAILED) return;
-	memcpy(shm, fds, fdlistsize);
-
-	if (munmap(shm, fdlistsize)) return;
-
-
-
 	if (lc_limitfd(fd_devnull, LIBCAPABILITY_CAPMASK_DEVNULL) < 0)
 		return;
 	if (lc_limitfd(fd_sandbox, LIBCAPABILITY_CAPMASK_SANDBOX) < 0)
@@ -254,9 +258,11 @@
 		return;
 	sbuf_delete(sbufp);
 
-	sprintf(fdliststr, "%d", 10);
-	if (setenv(LIBCAPABILITY_SANDBOX_FDLIST, fdliststr, 1) == -1)
-		return;
+	if (fds != NULL) {
+		sprintf(fdliststr, "%d", 10);
+		if (setenv(LIBCAPABILITY_SANDBOX_FDLIST, fdliststr, 1) == -1)
+			return;
+	}
 
 	if (cap_enter() < 0)
 		return;


More information about the p4-projects mailing list