aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_event.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2013-09-26 13:17:31 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2013-09-26 13:17:31 +0000
commit9d2abcd01aabdbb07a57e0f789291ed64042fab2 (patch)
treebf86fe1b615fbb275d1e27c1dc87faca0997ee06 /sys/kern/kern_event.c
parent27884e3bd1ee31472fe9720358da590b19e48eb8 (diff)
downloadsrc-9d2abcd01aabdbb07a57e0f789291ed64042fab2.tar.gz
src-9d2abcd01aabdbb07a57e0f789291ed64042fab2.zip
Notes
Diffstat (limited to 'sys/kern/kern_event.c')
-rw-r--r--sys/kern/kern_event.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index fe6f238852b5..4c068bf0f316 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -554,8 +554,17 @@ static int
filt_timerattach(struct knote *kn)
{
struct callout *calloutp;
+ sbintime_t to;
unsigned int ncallouts;
+ if ((intptr_t)kn->kn_sdata < 0)
+ return (EINVAL);
+ if ((intptr_t)kn->kn_sdata == 0 && (kn->kn_flags & EV_ONESHOT) == 0)
+ kn->kn_sdata = 1;
+ to = timer2sbintime(kn->kn_sdata);
+ if (to < 0)
+ return (EINVAL);
+
ncallouts = atomic_load_explicit(&kq_ncallouts, memory_order_relaxed);
do {
if (ncallouts >= kq_calloutmax)
@@ -569,8 +578,7 @@ filt_timerattach(struct knote *kn)
calloutp = malloc(sizeof(*calloutp), M_KQUEUE, M_WAITOK);
callout_init(calloutp, CALLOUT_MPSAFE);
kn->kn_hook = calloutp;
- callout_reset_sbt_on(calloutp,
- timer2sbintime(kn->kn_sdata), 0 /* 1ms? */,
+ callout_reset_sbt_on(calloutp, to, 0 /* 1ms? */,
filt_timerexpire, kn, PCPU_GET(cpuid), 0);
return (0);