diff options
author | phk <phk@FreeBSD.org> | 2004-06-09 09:29:08 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-06-09 09:29:08 +0000 |
commit | f9d30f0a79bd263914611cc21c63530b1d564437 (patch) | |
tree | 3d50b2bf0cf4f150a191765b9d1c6c1e0a700c1e /sys | |
parent | 6c64927139b3c6d9d3e54baeaf0c8d0ba929ebf8 (diff) | |
download | FreeBSD-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.c | 5 |
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); } |