From: ajs Date: Sun, 13 Mar 2005 19:27:22 +0000 (+0000) Subject: 2005-03-13 Andrew J. Schorr X-Git-Tag: frr-2.0-rc1~3145 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=9dbc797274ca5df614d61784658b8f809bbd8e2b;p=matthieu%2Ffrr.git 2005-03-13 Andrew J. Schorr * 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 668999f938..f169b8e281 100644 --- a/ospfd/ChangeLog +++ b/ospfd/ChangeLog @@ -1,3 +1,12 @@ +2005-03-13 Andrew J. Schorr + + * 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 * ospfd.h: Add new field struct stream *ibuf to struct ospf. diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c index 13302dd3de..203c4a5e69 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",