mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-29 15:51:32 +00:00
[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:
parent
90b68769a1
commit
c7350c4846
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user