diff options
author | emaste <emaste@FreeBSD.org> | 2007-03-26 17:41:14 +0000 |
---|---|---|
committer | emaste <emaste@FreeBSD.org> | 2007-03-26 17:41:14 +0000 |
commit | 3cb53690e0c2c81ed3b336133bf003c7b3173abf (patch) | |
tree | 8c94c3ef49d877f9ef704374bde228681a022a3a /sys/kern/sysv_sem.c | |
parent | 1fe075e853fb3c260edf10b8f13ee2f659477751 (diff) | |
download | FreeBSD-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.c | 7 |
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 |