]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd, lib: fix flex-algo database memory leak at area destruction
authorLouis Scalbert <louis.scalbert@6wind.com>
Mon, 24 Apr 2023 16:19:03 +0000 (18:19 +0200)
committerLouis Scalbert <louis.scalbert@6wind.com>
Thu, 27 Apr 2023 13:37:36 +0000 (15:37 +0200)
Free flex-algorithm database memory when an IS-IS area is destroyed.

Fixes: 735fb37db1 ("lib: add library for igp flexible-algorithm")
Fixes: 7f198e063c ("isisd: add isis flex-algo base interface")
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
isisd/isisd.c
lib/flex_algo.c
lib/flex_algo.h

index 4b01a18ecdc7f447c236abdd1385f233b7e92e4e..ea304ba5efdff909598bb6f85541a871623621e6 100644 (file)
@@ -520,6 +520,10 @@ void isis_area_destroy(struct isis_area *area)
        isis_area_invalidate_routes(area, area->is_type);
        isis_area_verify_routes(area);
 
+#ifndef FABRICD
+       flex_algos_free(area->flex_algos);
+#endif /* ifndef FABRICD */
+
        isis_sr_area_term(area);
 
        isis_mpls_te_term(area);
index b363b5f277d6a831c79e1332d7a6cb3044a3bc6f..72cefc551d7e53b646912e898bcf29c3fe693d56 100644 (file)
@@ -20,6 +20,9 @@
 DEFINE_MTYPE_STATIC(LIB, FLEX_ALGO_DATABASE, "Flex-Algo database");
 DEFINE_MTYPE_STATIC(LIB, FLEX_ALGO, "Flex-Algo algorithm information");
 
+static void _flex_algo_delete(struct flex_algos *flex_algos,
+                             struct flex_algo *fa);
+
 struct flex_algos *flex_algos_alloc(flex_algo_allocator_t allocator,
                                    flex_algo_releaser_t releaser)
 {
@@ -32,6 +35,17 @@ struct flex_algos *flex_algos_alloc(flex_algo_allocator_t allocator,
        return flex_algos;
 }
 
+void flex_algos_free(struct flex_algos *flex_algos)
+{
+       struct listnode *node, *nnode;
+       struct flex_algo *fa;
+
+       for (ALL_LIST_ELEMENTS(flex_algos->flex_algos, node, nnode, fa))
+               _flex_algo_delete(flex_algos, fa);
+       list_delete(&flex_algos->flex_algos);
+       XFREE(MTYPE_FLEX_ALGO_DATABASE, flex_algos);
+}
+
 struct flex_algo *flex_algo_alloc(struct flex_algos *flex_algos,
                                  uint8_t algorithm, void *arg)
 {
index e012f46862fd05754f46c3a51b056e39dcfc77da..9fc2851603295205fe915aa6239f7f06f4247a0c 100644 (file)
@@ -107,6 +107,7 @@ struct flex_algos {
  */
 struct flex_algos *flex_algos_alloc(flex_algo_allocator_t allocator,
                                    flex_algo_releaser_t releaser);
+void flex_algos_free(struct flex_algos *flex_algos);
 struct flex_algo *flex_algo_alloc(struct flex_algos *flex_algos,
                                  uint8_t algorithm, void *arg);
 struct flex_algo *flex_algo_lookup(struct flex_algos *flex_algos,