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