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 /ospfd | |
| 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]
Diffstat (limited to 'ospfd')
| -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", | 
