diff options
author | peter <peter@FreeBSD.org> | 2002-08-23 22:43:28 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2002-08-23 22:43:28 +0000 |
commit | 6bc0c8ebd0dfc97c68e07e0a753a188f3019a9c6 (patch) | |
tree | 425089093d5af3e6fea5f68792f093f577a7deab /sys/kern/sys_generic.c | |
parent | 62ae5e716ddb02706cc7d3d5091c121aa9da4cda (diff) | |
download | FreeBSD-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.c | 6 |
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]) |