svn commit: r187298 - head/sys/kern
Konstantin Belousov
kib at FreeBSD.org
Thu Jan 15 04:15:47 PST 2009
Author: kib
Date: Thu Jan 15 12:15:46 2009
New Revision: 187298
URL: http://svn.freebsd.org/changeset/base/187298
Log:
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
Modified:
head/sys/kern/sysv_sem.c
Modified: head/sys/kern/sysv_sem.c
==============================================================================
--- head/sys/kern/sysv_sem.c Thu Jan 15 11:54:31 2009 (r187297)
+++ head/sys/kern/sysv_sem.c Thu Jan 15 12:15:46 2009 (r187298)
@@ -914,6 +914,9 @@ semget(struct thread *td, struct semget_
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_
#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 {
More information about the svn-src-all
mailing list