summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_generic.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2002-08-23 22:43:28 +0000
committerpeter <peter@FreeBSD.org>2002-08-23 22:43:28 +0000
commit6bc0c8ebd0dfc97c68e07e0a753a188f3019a9c6 (patch)
tree425089093d5af3e6fea5f68792f093f577a7deab /sys/kern/sys_generic.c
parent62ae5e716ddb02706cc7d3d5091c121aa9da4cda (diff)
downloadFreeBSD-src-6bc0c8ebd0dfc97c68e07e0a753a188f3019a9c6.zip
FreeBSD-src-6bc0c8ebd0dfc97c68e07e0a753a188f3019a9c6.tar.gz
Move the TAILQ_INIT(&td->td_selq) before the retry: label. Otherwise in
some circumstances when we get a select collision, we can end up with cases where we do not clear some sip->si_thread on the way out, leading to page faults in selwakeup(). This should solve the problem where postfix can crash the kernel during select collisions. Reviewed by: alfred
Diffstat (limited to 'sys/kern/sys_generic.c')
-rw-r--r--sys/kern/sys_generic.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index 8e209bb..54214e8 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -795,6 +795,7 @@ select(td, uap)
atv.tv_usec = 0;
}
timo = 0;
+ TAILQ_INIT(&td->td_selq);
mtx_lock(&sellock);
retry:
ncoll = nselcoll;
@@ -803,8 +804,6 @@ retry:
mtx_unlock_spin(&sched_lock);
mtx_unlock(&sellock);
- /* XXX Is there a better place for this? */
- TAILQ_INIT(&td->td_selq);
error = selscan(td, ibits, obits, uap->nd);
mtx_lock(&sellock);
if (error || td->td_retval[0])
@@ -975,6 +974,7 @@ poll(td, uap)
atv.tv_usec = 0;
}
timo = 0;
+ TAILQ_INIT(&td->td_selq);
mtx_lock(&sellock);
retry:
ncoll = nselcoll;
@@ -983,8 +983,6 @@ retry:
mtx_unlock_spin(&sched_lock);
mtx_unlock(&sellock);
- /* XXX Is there a better place for this? */
- TAILQ_INIT(&td->td_selq);
error = pollscan(td, (struct pollfd *)bits, nfds);
mtx_lock(&sellock);
if (error || td->td_retval[0])
OpenPOWER on IntegriCloud