summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorajs <ajs>2005-03-13 19:27:22 +0000
committerajs <ajs>2005-03-13 19:27:22 +0000
commit9dbc797274ca5df614d61784658b8f809bbd8e2b (patch)
tree97aa0b8f724e440a6bb12bc70b31c66b425b2a46
parented9bb6d524301cb7d1902ed94753ffa3c6dabf1e (diff)
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]
-rw-r--r--ospfd/ChangeLog9
-rw-r--r--ospfd/ospf_lsa.c9
2 files changed, 15 insertions, 3 deletions
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index 668999f9..f169b8e2 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 13302dd3..203c4a5e 100644
--- a/ospfd/ospf_lsa.c
+++ b/ospfd/ospf_lsa.c
@@ -3673,10 +3673,13 @@ ospf_lsa_refresh_walker (struct thread *t)
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",