From c7350c48462e305f18f6fb02eceac170f892e450 Mon Sep 17 00:00:00 2001 From: Paul Jakma Date: Tue, 29 Jan 2008 19:29:44 +0000 Subject: [isisd] Bug #437: fix ssert caused by bad list management 2008-01-29 James Carlson * 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. --- isisd/isis_flags.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'isisd/isis_flags.c') diff --git a/isisd/isis_flags.c b/isisd/isis_flags.c index 9c861c94..03c91101 100644 --- a/isisd/isis_flags.c +++ b/isisd/isis_flags.c @@ -29,6 +29,13 @@ #include "isisd/isis_common.h" #include "isisd/isis_flags.h" +void +flags_initialize (struct flags *flags) +{ + flags->maxindex = 0; + flags->free_idcs = NULL; +} + int 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) { - flags->maxindex++; - index = flags->maxindex; + index = flags->maxindex++; } else { node = listhead (flags->free_idcs); index = (int) listgetdata (node); listnode_delete (flags->free_idcs, (void *) index); + index--; } return index; @@ -53,12 +60,18 @@ flags_get_index (struct flags *flags) void flags_free_index (struct flags *flags, int index) { + if (index + 1 == flags->maxindex) + { + flags->maxindex--; + return; + } + if (flags->free_idcs == NULL) { flags->free_idcs = list_new (); } - listnode_add (flags->free_idcs, (void *) index); + listnode_add (flags->free_idcs, (void *) (index + 1)); return; } -- cgit v1.2.1