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;
}
}