diff options
author | jhb <jhb@FreeBSD.org> | 2000-07-12 22:46:40 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2000-07-12 22:46:40 +0000 |
commit | a378d2d97e98f6373cebcb85e73c7b3b9e2b577f (patch) | |
tree | d7d58917aeb5acb36b40cc13a8502725b92f64f1 /sys/kern/sys_generic.c | |
parent | f7e133ab0b0dcd0e8bdb71621fe830ef20b05230 (diff) | |
download | FreeBSD-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.c | 4 |
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; |