Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Jan 2009 12:15:46 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r187298 - head/sys/kern
Message-ID:  <200901151215.n0FCFkrh076787@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901151215.n0FCFkrh076787>