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