summaryrefslogtreecommitdiffstats
path: root/sys/kern/sysv_sem.c
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2007-03-26 17:41:14 +0000
committeremaste <emaste@FreeBSD.org>2007-03-26 17:41:14 +0000
commit3cb53690e0c2c81ed3b336133bf003c7b3173abf (patch)
tree8c94c3ef49d877f9ef704374bde228681a022a3a /sys/kern/sysv_sem.c
parent1fe075e853fb3c260edf10b8f13ee2f659477751 (diff)
downloadFreeBSD-src-3cb53690e0c2c81ed3b336133bf003c7b3173abf.zip
FreeBSD-src-3cb53690e0c2c81ed3b336133bf003c7b3173abf.tar.gz
Avoid manipulating semu_list outside of the scope of SEMUNDO_LOCK(). This
would lead to an occasional hang with a cycle in semu_list. X-Discussed-On: hackers@
Diffstat (limited to 'sys/kern/sysv_sem.c')
-rw-r--r--sys/kern/sysv_sem.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index 3ca4ff5..e7d1c5a 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -1287,8 +1287,10 @@ semexit_myhook(arg, p)
*/
SEMUNDO_LOCK();
SLIST_FOREACH_PREVPTR(suptr, supptr, &semu_list, un_next) {
- if (suptr->un_proc == p)
+ if (suptr->un_proc == p) {
+ *supptr = SLIST_NEXT(suptr, un_next);
break;
+ }
}
SEMUNDO_UNLOCK();
@@ -1348,8 +1350,9 @@ semexit_myhook(arg, p)
* Deallocate the undo vector.
*/
DPRINTF(("removing vector\n"));
+ SEMUNDO_LOCK();
suptr->un_proc = NULL;
- *supptr = SLIST_NEXT(suptr, un_next);
+ SEMUNDO_UNLOCK();
}
static int
OpenPOWER on IntegriCloud