summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2004-06-09 09:29:08 +0000
committerphk <phk@FreeBSD.org>2004-06-09 09:29:08 +0000
commitf9d30f0a79bd263914611cc21c63530b1d564437 (patch)
tree3d50b2bf0cf4f150a191765b9d1c6c1e0a700c1e /sys
parent6c64927139b3c6d9d3e54baeaf0c8d0ba929ebf8 (diff)
downloadFreeBSD-src-f9d30f0a79bd263914611cc21c63530b1d564437.zip
FreeBSD-src-f9d30f0a79bd263914611cc21c63530b1d564437.tar.gz
Fix a race in destruction of sessions.
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_proc.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 2bdd0ef..029c9fa 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -447,6 +447,7 @@ pgdelete(pgrp)
register struct pgrp *pgrp;
{
struct session *savesess;
+ int i;
sx_assert(&proctree_lock, SX_XLOCKED);
PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
@@ -465,10 +466,10 @@ pgdelete(pgrp)
LIST_REMOVE(pgrp, pg_hash);
savesess = pgrp->pg_session;
SESS_LOCK(savesess);
- savesess->s_count--;
+ i = --savesess->s_count;
SESS_UNLOCK(savesess);
PGRP_UNLOCK(pgrp);
- if (savesess->s_count == 0) {
+ if (i == 0) {
mtx_destroy(&savesess->s_mtx);
FREE(pgrp->pg_session, M_SESSION);
}
OpenPOWER on IntegriCloud