2005-03-13 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

	* ospf_lsa.c: (ospf_lsa_refresh_walker) If the system clock jumps
	  backward, then current time may be less than
	  ospf->lsa_refresher_started.  This was causing invalid values
	  for ospf->lsa_refresh_queue.index resulting in infinite loops.
	  Problem fixed by casting the expression to unsigned before taking
	  the modulus.

	[backport candidate]
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index 668999f..f169b8e 100644
--- a/ospfd/ChangeLog
+++ b/ospfd/ChangeLog
@@ -1,3 +1,12 @@
+2005-03-13 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+	* ospf_lsa.c: (ospf_lsa_refresh_walker) If the system clock jumps
+	  backward, then current time may be less than
+	  ospf->lsa_refresher_started.  This was causing invalid values
+	  for ospf->lsa_refresh_queue.index resulting in infinite loops.
+	  Problem fixed by casting the expression to unsigned before taking
+	  the modulus.
+
 2005-02-23 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
 	* ospfd.h: Add new field struct stream *ibuf to struct ospf.
diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c
index 13302dd..203c4a5 100644
--- a/ospfd/ospf_lsa.c
+++ b/ospfd/ospf_lsa.c
@@ -3673,10 +3673,13 @@
   
   i = ospf->lsa_refresh_queue.index;
   
+  /* Note: if clock has jumped backwards, then time change could be negative,
+     so we are careful to cast the expression to unsigned before taking
+     modulus. */
   ospf->lsa_refresh_queue.index =
-    (ospf->lsa_refresh_queue.index +
-     (time (NULL) - ospf->lsa_refresher_started) / OSPF_LSA_REFRESHER_GRANULARITY)
-    % OSPF_LSA_REFRESHER_SLOTS;
+   ((unsigned long)(ospf->lsa_refresh_queue.index +
+		    (time (NULL) - ospf->lsa_refresher_started) /
+		    OSPF_LSA_REFRESHER_GRANULARITY)) % OSPF_LSA_REFRESHER_SLOTS;
 
   if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
     zlog_debug ("LSA[Refresh]: ospf_lsa_refresh_walker(): next index %d",