svn commit: r184067 - head/sys/kern

David Xu davidxu at FreeBSD.org
Mon Oct 20 02:37:54 UTC 2008


Author: davidxu
Date: Mon Oct 20 02:37:53 2008
New Revision: 184067
URL: http://svn.freebsd.org/changeset/base/184067

Log:
  In realtimer_delete(), clear timer's value and interval to tell
  realtimer_expire() to not rearm the timer, otherwise there is a chance
  that a callout will be left there and be tiggered in future unexpectly.
  
  Bug reported by: tegge@

Modified:
  head/sys/kern/kern_time.c

Modified: head/sys/kern/kern_time.c
==============================================================================
--- head/sys/kern/kern_time.c	Mon Oct 20 01:46:54 2008	(r184066)
+++ head/sys/kern/kern_time.c	Mon Oct 20 02:37:53 2008	(r184067)
@@ -1242,6 +1242,12 @@ realtimer_delete(struct itimer *it)
 {
 	mtx_assert(&it->it_mtx, MA_OWNED);
 	
+	/*
+	 * clear timer's value and interval to tell realtimer_expire
+	 * to not rearm the timer.
+	 */
+	timespecclear(&it->it_time.it_value);
+	timespecclear(&it->it_time.it_interval);
 	ITIMER_UNLOCK(it);
 	callout_drain(&it->it_callout);
 	ITIMER_LOCK(it);
@@ -1391,9 +1397,11 @@ realtimer_expire(void *arg)
 			callout_reset(&it->it_callout, tvtohz(&tv),
 				 realtimer_expire, it);
 		}
+		itimer_enter(it);
 		ITIMER_UNLOCK(it);
 		itimer_fire(it);
 		ITIMER_LOCK(it);
+		itimer_leave(it);
 	} else if (timespecisset(&it->it_time.it_value)) {
 		ts = it->it_time.it_value;
 		timespecsub(&ts, &cts);


More information about the svn-src-head mailing list