Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 22 23:16:27 UTC 2024

Modified Files:
        src/sys/kern: kern_time.c

Log Message:
itimer_settime(9): Assert input is sane.

Caller is responsible for validating/sanitizing.

Prompted by:

PR kern/58914: timerfd_settime(2) is missing itimespecfix


To generate a diff of this commit:
cvs rdiff -u -r1.223 -r1.224 src/sys/kern/kern_time.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_time.c
diff -u src/sys/kern/kern_time.c:1.223 src/sys/kern/kern_time.c:1.224
--- src/sys/kern/kern_time.c:1.223	Thu Dec 19 23:41:45 2024
+++ src/sys/kern/kern_time.c	Sun Dec 22 23:16:26 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_time.c,v 1.223 2024/12/19 23:41:45 riastradh Exp $	*/
+/*	$NetBSD: kern_time.c,v 1.224 2024/12/22 23:16:26 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2004, 2005, 2007, 2008, 2009, 2020
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.223 2024/12/19 23:41:45 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.224 2024/12/22 23:16:26 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/resourcevar.h>
@@ -902,6 +902,9 @@ itimer_callout(void *arg)
  *
  *	If the callout had already fired but not yet run, fails with
  *	ERESTART -- caller must restart from the top to look up a timer.
+ *
+ *	Caller is responsible for validating it->it_value and
+ *	it->it_interval, e.g. with itimerfix or itimespecfix.
  */
 int
 itimer_settime(struct itimer *it)
@@ -911,6 +914,12 @@ itimer_settime(struct itimer *it)
 
 	KASSERT(itimer_lock_held());
 	KASSERT(!it->it_dying);
+	KASSERT(it->it_time.it_value.tv_sec >= 0);
+	KASSERT(it->it_time.it_value.tv_nsec >= 0);
+	KASSERT(it->it_time.it_value.tv_nsec < 1000000000);
+	KASSERT(it->it_time.it_interval.tv_sec >= 0);
+	KASSERT(it->it_time.it_interval.tv_nsec >= 0);
+	KASSERT(it->it_time.it_interval.tv_nsec < 1000000000);
 
 	if (!CLOCK_VIRTUAL_P(it->it_clockid)) {
 		/*

Reply via email to