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",