Revision
23577
Author
zarzycki@apple.com
Date
2008-03-27 14:57:51 -0700 (Thu, 27 Mar 2008)

Log Message

Refinements.

Modified Paths

Diff

Modified: trunk/launchd/src/launchd_core_logic.c (23576 => 23577)


--- trunk/launchd/src/launchd_core_logic.c	2008-03-27 21:42:31 UTC (rev 23576)
+++ trunk/launchd/src/launchd_core_logic.c	2008-03-27 21:57:51 UTC (rev 23577)
@@ -2231,6 +2231,7 @@
 
 	if (j->shmem) {
 		job_assumes(j, munmap(j->shmem, getpagesize()) == 0);
+		j->shmem = NULL;
 	}
 
 	if (unlikely(j->weird_bootstrap)) {
@@ -5446,6 +5447,11 @@
 		return BOOTSTRAP_NOT_PRIVILEGED;
 	}
 
+	if (unlikely(j->shmem)) {
+		job_log(j, LOG_ERR, "Tried to setup shared memory more than once");
+		return BOOTSTRAP_NOT_PRIVILEGED;
+	}
+
 	size_of_page_orig = size_of_page = getpagesize();
 
 	if (!job_assumes(j, j->shmem = mmap(NULL, size_of_page, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0))) {

Modified: trunk/launchd/src/libvproc.c (23576 => 23577)


--- trunk/launchd/src/libvproc.c	2008-03-27 21:42:31 UTC (rev 23576)
+++ trunk/launchd/src/libvproc.c	2008-03-27 21:57:51 UTC (rev 23577)
@@ -54,6 +54,7 @@
 
 static int64_t cached_pid = -1;
 static struct vproc_shmem_s *vproc_shmem;
+static pthread_once_t shmem_inited = PTHREAD_ONCE_INIT;
 
 static void
 vproc_shmem_init(void)
@@ -94,8 +95,8 @@
 	int64_t newval;
 
 	if (unlikely(vproc_shmem == NULL)) {
-		vproc_shmem_init();
-		if (vproc_shmem == NULL) {
+		int po_r = pthread_once(&shmem_inited, vproc_shmem_init);
+		if (po_r != 0 || vproc_shmem == NULL) {
 			return;
 		}
 	}
@@ -147,8 +148,8 @@
 	int64_t newval;
 
 	if (unlikely(vproc_shmem == NULL)) {
-		vproc_shmem_init();
-		if (vproc_shmem == NULL) {
+		int po_r = pthread_once(&shmem_inited, vproc_shmem_init);
+		if (po_r != 0 || vproc_shmem == NULL) {
 			return NULL;
 		}
 	}