From 9dbc797274ca5df614d61784658b8f809bbd8e2b Mon Sep 17 00:00:00 2001 From: ajs Date: Sun, 13 Mar 2005 19:27:22 +0000 Subject: 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] --- ospfd/ChangeLog | 9 +++++++++ ospfd/ospf_lsa.c | 9 ++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) (limited to 'ospfd') 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 + + * 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 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", -- cgit v1.2.1