summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_generic.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2000-07-12 22:46:40 +0000
committerjhb <jhb@FreeBSD.org>2000-07-12 22:46:40 +0000
commita378d2d97e98f6373cebcb85e73c7b3b9e2b577f (patch)
treed7d58917aeb5acb36b40cc13a8502725b92f64f1 /sys/kern/sys_generic.c
parentf7e133ab0b0dcd0e8bdb71621fe830ef20b05230 (diff)
downloadFreeBSD-src-a378d2d97e98f6373cebcb85e73c7b3b9e2b577f.zip
FreeBSD-src-a378d2d97e98f6373cebcb85e73c7b3b9e2b577f.tar.gz
Fix a very obscure bug in select() and poll() where the timeout would
never expire if poll() or select() was called before the system had been in multiuser for 1 second. This was caused by only checking to see if tv_sec was zero rather than checking both tv_sec and tv_usec.
Diffstat (limited to 'sys/kern/sys_generic.c')
-rw-r--r--sys/kern/sys_generic.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index 7489e0e..6099c0b 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -703,7 +703,7 @@ retry:
error = selscan(p, ibits, obits, uap->nd);
if (error || p->p_retval[0])
goto done;
- if (atv.tv_sec) {
+ if (atv.tv_sec || atv.tv_usec) {
getmicrouptime(&rtv);
if (timevalcmp(&rtv, &atv, >=))
goto done;
@@ -836,7 +836,7 @@ retry:
error = pollscan(p, (struct pollfd *)bits, SCARG(uap, nfds));
if (error || p->p_retval[0])
goto done;
- if (atv.tv_sec) {
+ if (atv.tv_sec || atv.tv_usec) {
getmicrouptime(&rtv);
if (timevalcmp(&rtv, &atv, >=))
goto done;
OpenPOWER on IntegriCloud