aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_event.c
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2022-05-25 00:14:33 +0000
committerMark Johnston <markj@FreeBSD.org>2022-05-25 00:14:33 +0000
commit524dadf7a8725dea144571843e611dbdbd59d668 (patch)
tree7b1388daab8e501a5e94d6692b631695f2caa352 /sys/kern/kern_event.c
parentc728c56c870abe230e45cee5c477f0d890ebacef (diff)
downloadsrc-524dadf7a8725dea144571843e611dbdbd59d668.tar.gz
src-524dadf7a8725dea144571843e611dbdbd59d668.zip
kevent: Fix an off-by-one in filt_timerexpire_l()
Suppose a periodic kevent timer fires close to its deadline, so that now - kc->next is small. Then delta ends up being 1, and the next timer deadline is set to (delta + 1) * kc->to, where kc->to is the timer period. This means that the timer fires at half of the requested rate, and the value returned in kn_data is similarly inaccurate. PR: 264131 Fixes: 7cb40543e964 ("filt_timerexpire: do not iterate over the interval") Reviewed by: kib MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D35313
Diffstat (limited to 'sys/kern/kern_event.c')
-rw-r--r--sys/kern/kern_event.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 33607fe8c5f4..f1ee8de4e7ee 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -739,7 +739,7 @@ filt_timerexpire_l(struct knote *kn, bool proc_locked)
if (delta == 0)
delta = 1;
kn->kn_data += delta;
- kc->next += (delta + 1) * kc->to;
+ kc->next += delta * kc->to;
if (now >= kc->next) /* overflow */
kc->next = now + kc->to;
KNOTE_ACTIVATE(kn, 0); /* XXX - handle locking */