[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.
diff --git a/isisd/isis_flags.c b/isisd/isis_flags.c
index 9c861c9..03c9110 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 @@
 
   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 @@
 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;
 }