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