diff options
author | ajs <ajs> | 2005-03-13 19:27:22 +0000 |
---|---|---|
committer | ajs <ajs> | 2005-03-13 19:27:22 +0000 |
commit | 9dbc797274ca5df614d61784658b8f809bbd8e2b (patch) | |
tree | 97aa0b8f724e440a6bb12bc70b31c66b425b2a46 | |
parent | ed9bb6d524301cb7d1902ed94753ffa3c6dabf1e (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/ChangeLog | 9 | ||||
-rw-r--r-- | ospfd/ospf_lsa.c | 9 |
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", |