cputimer_intr_reload() - prevent a negatively indexed or too-small a reload
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 15 Jan 2007 19:08:10 +0000 (19:08 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 15 Jan 2007 19:08:10 +0000 (19:08 +0000)
value from loading the kqueue timer with an illegal value.

sys/platform/vkernel/platform/kqueue.c
sys/platform/vkernel/platform/systimer.c

index f753ab8..f145c1f 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/platform/vkernel/platform/kqueue.c,v 1.2 2007/01/15 05:27:31 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/platform/kqueue.c,v 1.3 2007/01/15 19:08:10 dillon Exp $
  */
 
 #include <sys/types.h>
@@ -166,6 +166,8 @@ kqueue_reload_timer(struct kqueue_info *info, int ms)
        struct timespec ts = { 0, 0 };
        struct kevent kev;
 
+       KKASSERT(ms > 0);
+
        EV_SET(&kev, info->fd, EVFILT_TIMER,
                EV_ADD|EV_ENABLE|EV_ONESHOT|EV_CLEAR, 0, (uintptr_t)ms, info);
        if (kevent(KQueueFd, &kev, 1, NULL, 0, &ts) < 0)
index 87c5112..73ccbfb 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/platform/vkernel/platform/systimer.c,v 1.10 2007/01/15 05:27:31 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/platform/systimer.c,v 1.11 2007/01/15 19:08:10 dillon Exp $
  */
 
 #include <sys/types.h>
@@ -135,13 +135,18 @@ cputimer_intr_config(struct cputimer *timer)
 }
 
 /*
- * Reload the interrupt for our core systimer.
+ * Reload the interrupt for our core systimer.  Because the caller's
+ * reload calculation can be negatively indexed, we need a minimal
+ * check to ensure that a reasonable reload value is selected. 
  */
 void
 cputimer_intr_reload(sysclock_t reload)
 {
-       if (kqueue_timer_info)
+       if (kqueue_timer_info) {
+               if ((int)reload < 1)
+                       reload = 1;
                kqueue_reload_timer(kqueue_timer_info, (reload + 999) / 1000);
+       }
 }
 
 /*