vlib: memory leak in vlib_register_errors on create and delete interface 47/36947/2
authorSteven Luong <sluong@cisco.com>
Thu, 18 Aug 2022 20:20:30 +0000 (13:20 -0700)
committerMatthew Smith <mgsmith@netgate.com>
Fri, 19 Aug 2022 15:06:42 +0000 (15:06 +0000)
format returns a vector which must be free or memory is leaked.

From show memory
  3716528    66716 0x7fffbfeb0db0 _vec_resize_internal + 0xe6
                                  _vec_add + 0x164
                                  do_percent + 0xb82
                                  va_format + 0xb9
                                  format + 0x156
                                  vlib_register_errors + 0x76c
                                  setup_tx_node + 0x5c
                                  vnet_register_interface + 0xca6
                                  vnet_eth_register_interface + 0xdd
                                  memif_create_if + 0x975
                                  memif_create_command_fn + 0x461
                                  vlib_cli_dispatch_sub_commands + 0xec8

(gdb) list *(vlib_register_errors + 0x76c)
0x7ffff6e8280c is in vlib_register_errors (/home/sluong/vpp/vpp/src/vlib/error.c:224).
219
220   vec_validate (nm->node_by_error, n->error_heap_index + n_errors - 1);
221
222   for (u32 i = 0; i < n_errors; i++)
223     {
224       t.format = (char *) format (0, "%v %s: %%d", n->name, cd[i].name);
225       vm->error_elog_event_types[n->error_heap_index + i] = t;
226       nm->node_by_error[n->error_heap_index + i] = n->index;
227     }

Type: fix

Signed-off-by: Steven Luong <sluong@cisco.com>
Change-Id: I2983f081b7e2c1b2d18d66afe45282933efbe127

src/vlib/error.c

index 7e72565..de2020f 100644 (file)
@@ -222,6 +222,7 @@ vlib_register_errors (vlib_main_t *vm, u32 node_index, u32 n_errors,
   for (u32 i = 0; i < n_errors; i++)
     {
       t.format = (char *) format (0, "%v %s: %%d", n->name, cd[i].name);
+      vec_free (vm->error_elog_event_types[n->error_heap_index + i].format);
       vm->error_elog_event_types[n->error_heap_index + i] = t;
       nm->node_by_error[n->error_heap_index + i] = n->index;
     }