summaryrefslogtreecommitdiffstats
path: root/sys/kern/sysv_sem.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2009-01-15 12:15:46 +0000
committerkib <kib@FreeBSD.org>2009-01-15 12:15:46 +0000
commit92e5c3777e09a6fcc69672aaaa92e078e302ccb5 (patch)
treeaae03d0ed37fbdec6c6457e4413d72361acc61c1 /sys/kern/sysv_sem.c
parentb5dbfe1e63e80aca30190452f78779af0ed82a77 (diff)
downloadFreeBSD-src-92e5c3777e09a6fcc69672aaaa92e078e302ccb5.zip
FreeBSD-src-92e5c3777e09a6fcc69672aaaa92e078e302ccb5.tar.gz
Lock the semaphore identifier lock during semaphore initialization to
guarantee atomicity of the operation for other semaphore consumers. In particular, this should guard against access to the semaphore with not done or partially done MAC label assignment. Reviewed by: rwatson MFC after: 1 month
Diffstat (limited to 'sys/kern/sysv_sem.c')
-rw-r--r--sys/kern/sysv_sem.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index 46a307f..0112a04 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -914,6 +914,9 @@ semget(struct thread *td, struct semget_args *uap)
goto done2;
}
DPRINTF(("semid %d is available\n", semid));
+ mtx_lock(&sema_mtx[semid]);
+ KASSERT((sema[semid].u.sem_perm.mode & SEM_ALLOC) == 0,
+ ("Lost semaphore %d", semid));
sema[semid].u.sem_perm.key = key;
sema[semid].u.sem_perm.cuid = cred->cr_uid;
sema[semid].u.sem_perm.uid = cred->cr_uid;
@@ -932,6 +935,7 @@ semget(struct thread *td, struct semget_args *uap)
#ifdef MAC
mac_sysvsem_create(cred, &sema[semid]);
#endif
+ mtx_unlock(&sema_mtx[semid]);
DPRINTF(("sembase = %p, next = %p\n",
sema[semid].u.sem_base, &sem[semtot]));
} else {
OpenPOWER on IntegriCloud