diff options
author | kib <kib@FreeBSD.org> | 2009-01-15 12:15:46 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2009-01-15 12:15:46 +0000 |
commit | 92e5c3777e09a6fcc69672aaaa92e078e302ccb5 (patch) | |
tree | aae03d0ed37fbdec6c6457e4413d72361acc61c1 /sys/kern/sysv_sem.c | |
parent | b5dbfe1e63e80aca30190452f78779af0ed82a77 (diff) | |
download | FreeBSD-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.c | 4 |
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 { |