]> git.puffer.fish Git - mirror/frr.git/commitdiff
[isisd] Bug #437: fix ssert caused by bad list management
authorPaul Jakma <paul.jakma@sun.com>
Tue, 29 Jan 2008 19:29:44 +0000 (19:29 +0000)
committerPaul Jakma <paul.jakma@sun.com>
Tue, 29 Jan 2008 19:29:44 +0000 (19:29 +0000)
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.

isisd/ChangeLog
isisd/isis_flags.c
isisd/isis_flags.h
isisd/isisd.c

index c2482f06df2251a9decb69ae9fa5628240c261e8..bb77ffea080ffc570bd3eec67965e9a3ae82e581 100644 (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>
 
        * isis_network.c: split up into isis_bpf.c, isis_dlpi.c, and
index 9c861c945c472ce2c0260e6e090dd72f0b4f05f0..03c91101fcb67d0cebdccf85d207d5b746caff75 100644 (file)
 #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;
 }
index f2421f2f41416ab6eed21cd2ec931bff839db689..13dd9e145683caa39afe7cc7b8c95f97195f81ef 100644 (file)
@@ -28,6 +28,7 @@
  * the support will be achived using the newest drafts */
 #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);
 int flags_get_index (struct flags *flags);
 void flags_free_index (struct flags *flags, int index);
index 48ea47afa2d314132ec333bb6c6377c0bfbded00..7c669fcbf2bce5b7f805e2b6419858db214ca4e9 100644 (file)
@@ -130,7 +130,7 @@ isis_area_create ()
   area->circuit_list = list_new ();
   area->area_addrs = list_new ();
   THREAD_TIMER_ON (master, area->t_tick, lsp_tick, area, 1);
-  area->flags.maxindex = -1;
+  flags_initialize (&area->flags);
   /*
    * Default values
    */
@@ -215,7 +215,11 @@ isis_area_destroy (struct vty *vty, const char *area_tag)
   if (area->circuit_list)
     {
       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);
     }