vlib: don't leak node frames on refork
[vpp.git] / src / vlib / drop.c
index e29195a..2a10225 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #include <vlib/vlib.h>
+#include <vppinfra/vector/count_equal.h>
 
 typedef enum
 {
@@ -73,7 +74,8 @@ counter_index (vlib_main_t * vm, vlib_error_t e)
   n = vlib_get_node (vm, ni);
 
   ci = vlib_error_get_code (&vm->node_main, e);
-  ASSERT (ci < n->n_errors);
+  if (ci >= n->n_errors)
+    return CLIB_U32_MAX;
 
   ci += n->error_heap_index;
 
@@ -93,7 +95,8 @@ format_error_trace (u8 * s, va_list * va)
   error_node = vlib_get_node (vm, vlib_error_get_node (&vm->node_main, e[0]));
   i = counter_index (vm, vlib_error_get_code (&vm->node_main, e[0])) +
     error_node->error_heap_index;
-  s = format (s, "%v: %s", error_node->name, em->error_strings_heap[i]);
+  if (i != CLIB_U32_MAX)
+    s = format (s, "%v: %s", error_node->name, em->counters_heap[i].desc);
 
   return s;
 }
@@ -221,7 +224,8 @@ process_drop_punt (vlib_main_t * vm,
       n_left -= count;
 
       c_index = counter_index (vm, error[0]);
-      em->counters[c_index] += count;
+      if (c_index != CLIB_U32_MAX)
+       em->counters[c_index] += count;
 
       vlib_error_elog_count (vm, c_index, count);
     }
@@ -232,7 +236,7 @@ process_drop_punt (vlib_main_t * vm,
 
       /* If there is no punt function, free the frame as well. */
       if (disposition == ERROR_DISPOSITION_PUNT && !vm->os_punt_frame)
-       vlib_frame_free (vm, node, frame);
+       vlib_frame_free (vm, frame);
     }
   else
     vm->os_punt_frame (vm, node, frame);