]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #13376 from louis-6wind/fix-flex-algo-mem-leak
authorRuss White <russ@riw.us>
Tue, 2 May 2023 15:33:38 +0000 (11:33 -0400)
committerGitHub <noreply@github.com>
Tue, 2 May 2023 15:33:38 +0000 (11:33 -0400)
isisd, lib: fix flex-algo memory leak

isisd/isis_flex_algo.c
isisd/isis_spf.c
isisd/isisd.c
lib/flex_algo.c
lib/flex_algo.h

index 0efc519eaba6f1d5643182806a6cfb9c8dbd0047..ef30987b8e7cbbbea96b94c6c760ec13f1d4a872 100644 (file)
@@ -45,7 +45,7 @@ void *isis_flex_algo_data_alloc(void *voidarg)
        struct isis_flex_algo_alloc_arg *arg = voidarg;
        struct isis_flex_algo_data *data;
 
-       data = XCALLOC(MTYPE_FLEX_ALGO, sizeof(*data));
+       data = XCALLOC(MTYPE_FLEX_ALGO, sizeof(struct isis_flex_algo_data));
 
        for (int tree = SPFTREE_IPV4; tree < SPFTREE_COUNT; tree++) {
                for (int level = ISIS_LEVEL1; level <= ISIS_LEVEL2; level++) {
@@ -70,6 +70,7 @@ void isis_flex_algo_data_free(void *voiddata)
                        if (data->spftree[tree][level - 1])
                                isis_spftree_del(
                                        data->spftree[tree][level - 1]);
+       XFREE(MTYPE_FLEX_ALGO, data);
 }
 
 static struct isis_router_cap_fad *
index 156c8b08982b365fa17999e328f6efdfc8b23d46..de467c8262d73af0e5ce08d65678cae3fccc8ea7 100644 (file)
@@ -393,14 +393,14 @@ static void _isis_spftree_del(struct isis_spftree *spftree)
        isis_vertex_queue_free(&spftree->paths);
        isis_route_table_info_free(spftree->route_table->info);
        isis_route_table_info_free(spftree->route_table_backup->info);
+       route_table_finish(spftree->route_table);
+       route_table_finish(spftree->route_table_backup);
 }
 
 void isis_spftree_del(struct isis_spftree *spftree)
 {
        _isis_spftree_del(spftree);
 
-       route_table_finish(spftree->route_table);
-       route_table_finish(spftree->route_table_backup);
        spftree->route_table = NULL;
 
        XFREE(MTYPE_ISIS_SPFTREE, spftree);
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 efeacb5a0c29e8ad25f1ca99fcfb24b88ecf98fa..f48117ff1b1511555c66e36002372d8a12b04cfe 100644 (file)
 
 #include "flex_algo.h"
 
-DEFINE_MTYPE_STATIC(LIB, FLEX_ALGO, "Flex-Algo Definition");
+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)
 {
        struct flex_algos *flex_algos;
 
-       flex_algos = XCALLOC(MTYPE_FLEX_ALGO, sizeof(*flex_algos));
+       flex_algos =
+               XCALLOC(MTYPE_FLEX_ALGO_DATABASE, sizeof(struct flex_algos));
        flex_algos->flex_algos = list_new();
        flex_algos->allocator = allocator;
        flex_algos->releaser = releaser;
        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)
 {
        struct flex_algo *fa;
 
-       fa = XCALLOC(MTYPE_FLEX_ALGO, sizeof(*fa));
+       fa = XCALLOC(MTYPE_FLEX_ALGO, sizeof(struct flex_algo));
        fa->algorithm = algorithm;
        if (flex_algos->allocator)
                fa->data = flex_algos->allocator(arg);
@@ -47,6 +63,31 @@ struct flex_algo *flex_algo_alloc(struct flex_algos *flex_algos,
        return fa;
 }
 
+static void _flex_algo_delete(struct flex_algos *flex_algos,
+                             struct flex_algo *fa)
+{
+       if (flex_algos->releaser)
+               flex_algos->releaser(fa->data);
+       admin_group_term(&fa->admin_group_exclude_any);
+       admin_group_term(&fa->admin_group_include_any);
+       admin_group_term(&fa->admin_group_include_all);
+       listnode_delete(flex_algos->flex_algos, fa);
+       XFREE(MTYPE_FLEX_ALGO, fa);
+}
+
+
+void flex_algo_delete(struct flex_algos *flex_algos, uint8_t algorithm)
+{
+       struct listnode *node, *nnode;
+       struct flex_algo *fa;
+
+       for (ALL_LIST_ELEMENTS(flex_algos->flex_algos, node, nnode, fa)) {
+               if (fa->algorithm != algorithm)
+                       continue;
+               _flex_algo_delete(flex_algos, fa);
+       }
+}
+
 /**
  * @brief Look up the local flex-algo object by its algorithm number.
  * @param algorithm flex-algo algorithm number
@@ -99,25 +140,6 @@ bool flex_algo_definition_cmp(struct flex_algo *fa1, struct flex_algo *fa2)
        return true;
 }
 
-void flex_algo_delete(struct flex_algos *flex_algos, uint8_t algorithm)
-{
-       struct listnode *node, *nnode;
-       struct flex_algo *fa;
-
-       for (ALL_LIST_ELEMENTS(flex_algos->flex_algos, node, nnode, fa)) {
-               if (fa->algorithm != algorithm)
-                       continue;
-               if (flex_algos->releaser)
-                       flex_algos->releaser(fa->data);
-               admin_group_term(&fa->admin_group_exclude_any);
-               admin_group_term(&fa->admin_group_include_any);
-               admin_group_term(&fa->admin_group_include_all);
-               listnode_delete(flex_algos->flex_algos, fa);
-               XFREE(MTYPE_FLEX_ALGO, fa);
-               return;
-       }
-}
-
 /**
  * Check SR Algorithm is Flex-Algo
  * according to RFC9350 section 4
index 81a0af85b8828130b175d790a0936fadc6293c22..e617e7cae849e56c8aaa4da00965b73058e8dd87 100644 (file)
@@ -112,6 +112,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,