fib: multiple memory leaks upon deleting a VRF table 35/34735/5
authorSteven Luong <sluong@cisco.com>
Wed, 15 Dec 2021 21:27:53 +0000 (13:27 -0800)
committerNeale Ranns <neale@graphiant.com>
Sun, 9 Jan 2022 13:43:50 +0000 (13:43 +0000)
fib_table->ft_locks
name string for parsing the ip table add|del name <tag> command
path list for ip4_specials in mfib
mfib->fib_entry_by_dst_address[0..32]
mfib entry path_ext, msrc->mfes_exts

Type: fix

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

src/vnet/fib/ip4_fib.c
src/vnet/ip/lookup.c
src/vnet/mfib/ip4_mfib.c
src/vnet/mfib/mfib_entry.c

index 2fa5d7e..8e580a5 100644 (file)
@@ -216,6 +216,7 @@ ip4_fib_table_destroy (u32 fib_index)
        hash_unset (ip4_main.fib_index_by_table_id, fib_table->ft_table_id);
     }
 
+    vec_free (fib_table->ft_locks);
     vec_free(fib_table->ft_src_route_counts);
     ip4_fib_table_free(v4_fib);
 
index b678ce3..c2c4bae 100644 (file)
@@ -410,6 +410,7 @@ vnet_ip_table_cmd (vlib_main_t * vm,
        }
 
 done:
+  vec_free (name);
   unformat_free (line_input);
   return error;
 }
index e71b7db..2ad873f 100644 (file)
@@ -42,6 +42,18 @@ static const mfib_prefix_t ip4_specials[] =
         .fp_proto = FIB_PROTOCOL_IP4,
     },
 };
+static const fib_route_path_t ip4_special_path =
+  {
+   .frp_proto = DPO_PROTO_IP4,
+   .frp_addr = {
+               .ip4.data_u32 = 0x0,
+               },
+   .frp_sw_if_index = ~0,
+   .frp_fib_index = ~0,
+   .frp_weight = 1,
+   .frp_flags = FIB_ROUTE_PATH_LOCAL,
+   .frp_mitf_flags = MFIB_ITF_FLAG_FORWARD,
+  };
 
 static u32
 ip4_create_mfib_with_table_id (u32 table_id,
@@ -76,15 +88,6 @@ ip4_create_mfib_with_table_id (u32 table_id,
                             MFIB_RPF_ID_NONE,
                             MFIB_ENTRY_FLAG_DROP);
 
-    const fib_route_path_t path = {
-        .frp_proto = DPO_PROTO_IP4,
-        .frp_addr = zero_addr,
-        .frp_sw_if_index = ~0,
-        .frp_fib_index = ~0,
-        .frp_weight = 1,
-        .frp_flags = FIB_ROUTE_PATH_LOCAL,
-        .frp_mitf_flags = MFIB_ITF_FLAG_FORWARD,
-    };
     int ii;
 
     for (ii = 0; ii < ARRAY_LEN(ip4_specials); ii++)
@@ -93,7 +96,7 @@ ip4_create_mfib_with_table_id (u32 table_id,
                                      &ip4_specials[ii],
                                      MFIB_SOURCE_SPECIAL,
                                      MFIB_ENTRY_FLAG_NONE,
-                                     &path);
+                                     &ip4_special_path);
     }
 
     return (mfib_table->mft_index);
@@ -113,11 +116,12 @@ ip4_mfib_table_destroy (ip4_mfib_t *mfib)
                             MFIB_SOURCE_DEFAULT_ROUTE);
 
     for (ii = 0; ii < ARRAY_LEN(ip4_specials); ii++)
-    {
-        mfib_table_entry_delete(mfib_table->mft_index,
-                                &ip4_specials[ii],
-                                MFIB_SOURCE_SPECIAL);
-    }
+      {
+       mfib_table_entry_path_remove(mfib_table->mft_index,
+                                    &ip4_specials[ii],
+                                    MFIB_SOURCE_SPECIAL,
+                                    &ip4_special_path);
+      }
 
     /*
      * validate no more routes.
@@ -125,6 +129,8 @@ ip4_mfib_table_destroy (ip4_mfib_t *mfib)
     ASSERT(0 == mfib_table->mft_total_route_counts);
     ASSERT(~0 != mfib_table->mft_table_id);
 
+    for (u32 i = 0; i < ARRAY_LEN (mfib->fib_entry_by_dst_address); i++)
+      hash_free (mfib->fib_entry_by_dst_address[i]);
     hash_unset (ip4_main.mfib_index_by_table_id, mfib_table->mft_table_id);
     pool_put(ip4_main.mfibs, mfib_table);
 }
index 8050882..20945aa 100644 (file)
@@ -412,6 +412,8 @@ mfib_entry_src_flush (mfib_entry_src_t *msrc)
     }));
     hash_free(msrc->mfes_itfs);
     msrc->mfes_itfs = NULL;
+    hash_free(msrc->mfes_exts);
+    msrc->mfes_exts = NULL;
     fib_path_list_unlock(msrc->mfes_pl);
 }