[isisd] Bug #437: fix ssert caused by bad list management

2008-01-29 James Carlson <james.d.carlson@sun.com>

	* Fix bug #437, assert due to bogus index management
	* isis_flags.c: (flags_initialize) new
	* (flags_get_index) fix off by one, leading to list assert
	  on null node data.
	  (flags_free_index) ditto.
	* isisd.c: (isis_area_create) use flags_initialize
	  (isis_area_destroy) deconfigure circuits when
	  taking down area.
This commit is contained in:
Paul Jakma 2008-01-29 19:29:44 +00:00
parent 90b68769a1
commit c7350c4846
4 changed files with 34 additions and 5 deletions

View File

@ -1,3 +1,14 @@
2008-01-29 James Carlson <james.d.carlson@sun.com>
* Fix bug #437, assert due to bogus index management
* isis_flags.c: (flags_initialize) new
* (flags_get_index) fix off by one, leading to list assert
on null node data.
(flags_free_index) ditto.
* isisd.c: (isis_area_create) use flags_initialize
(isis_area_destroy) deconfigure circuits when
taking down area.
2007-07-18 James Carlson <james.d.carlson@sun.com> 2007-07-18 James Carlson <james.d.carlson@sun.com>
* isis_network.c: split up into isis_bpf.c, isis_dlpi.c, and * isis_network.c: split up into isis_bpf.c, isis_dlpi.c, and

View File

@ -29,6 +29,13 @@
#include "isisd/isis_common.h" #include "isisd/isis_common.h"
#include "isisd/isis_flags.h" #include "isisd/isis_flags.h"
void
flags_initialize (struct flags *flags)
{
flags->maxindex = 0;
flags->free_idcs = NULL;
}
int int
flags_get_index (struct flags *flags) flags_get_index (struct flags *flags)
{ {
@ -37,14 +44,14 @@ flags_get_index (struct flags *flags)
if (flags->free_idcs == NULL || flags->free_idcs->count == 0) if (flags->free_idcs == NULL || flags->free_idcs->count == 0)
{ {
flags->maxindex++; index = flags->maxindex++;
index = flags->maxindex;
} }
else else
{ {
node = listhead (flags->free_idcs); node = listhead (flags->free_idcs);
index = (int) listgetdata (node); index = (int) listgetdata (node);
listnode_delete (flags->free_idcs, (void *) index); listnode_delete (flags->free_idcs, (void *) index);
index--;
} }
return index; return index;
@ -53,12 +60,18 @@ flags_get_index (struct flags *flags)
void void
flags_free_index (struct flags *flags, int index) flags_free_index (struct flags *flags, int index)
{ {
if (index + 1 == flags->maxindex)
{
flags->maxindex--;
return;
}
if (flags->free_idcs == NULL) if (flags->free_idcs == NULL)
{ {
flags->free_idcs = list_new (); flags->free_idcs = list_new ();
} }
listnode_add (flags->free_idcs, (void *) index); listnode_add (flags->free_idcs, (void *) (index + 1));
return; return;
} }

View File

@ -28,6 +28,7 @@
* the support will be achived using the newest drafts */ * the support will be achived using the newest drafts */
#define ISIS_MAX_CIRCUITS 32 /* = 1024 */ /*FIXME:defined in lsp.h as well */ #define ISIS_MAX_CIRCUITS 32 /* = 1024 */ /*FIXME:defined in lsp.h as well */
void flags_initialize (struct flags *flags);
struct flags *new_flags (int size); struct flags *new_flags (int size);
int flags_get_index (struct flags *flags); int flags_get_index (struct flags *flags);
void flags_free_index (struct flags *flags, int index); void flags_free_index (struct flags *flags, int index);

View File

@ -130,7 +130,7 @@ isis_area_create ()
area->circuit_list = list_new (); area->circuit_list = list_new ();
area->area_addrs = list_new (); area->area_addrs = list_new ();
THREAD_TIMER_ON (master, area->t_tick, lsp_tick, area, 1); THREAD_TIMER_ON (master, area->t_tick, lsp_tick, area, 1);
area->flags.maxindex = -1; flags_initialize (&area->flags);
/* /*
* Default values * Default values
*/ */
@ -215,7 +215,11 @@ isis_area_destroy (struct vty *vty, const char *area_tag)
if (area->circuit_list) if (area->circuit_list)
{ {
for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit)) for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
isis_circuit_del (circuit); {
/* The fact that it's in circuit_list means that it was configured */
isis_circuit_deconfigure (circuit, area);
isis_circuit_del (circuit);
}
list_delete (area->circuit_list); list_delete (area->circuit_list);
} }