]> 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

1  2 
isisd/isis_spf.c
lib/flex_algo.c
lib/flex_algo.h

diff --combined isisd/isis_spf.c
index 156c8b08982b365fa17999e328f6efdfc8b23d46,3f19630b556cd3a00eac23bf826c59e99d74548f..de467c8262d73af0e5ce08d65678cae3fccc8ea7
@@@ -393,14 -393,14 +393,14 @@@ static void _isis_spftree_del(struct is
        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);
@@@ -1886,8 -1886,8 +1886,8 @@@ void isis_run_spf(struct isis_spftree *
         * Flexible-Algorithm.
         */
        if (flex_algo_id_valid(spftree->algorithm) &&
 -          !isis_flex_algo_elected_supported(spftree->algorithm,
 -                                            spftree->area)) {
 +          !flex_algo_get_state(spftree->area->flex_algos,
 +                               spftree->algorithm)) {
                if (!CHECK_FLAG(spftree->flags, F_SPFTREE_DISABLED)) {
                        isis_spftree_clear(spftree);
                        SET_FLAG(spftree->flags, F_SPFTREE_DISABLED);
diff --combined lib/flex_algo.c
index efeacb5a0c29e8ad25f1ca99fcfb24b88ecf98fa,b4ae86369f2bf4405e4f4c25344e6dd80cfb435d..f48117ff1b1511555c66e36002372d8a12b04cfe
  
  #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);
        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
@@@ -79,12 -120,6 +120,12 @@@ bool flex_algo_definition_cmp(struct fl
                return false;
        if (fa1->metric_type != fa2->metric_type)
                return false;
 +      if (fa1->exclude_srlg != fa2->exclude_srlg)
 +              return false;
 +      if (fa1->flags != fa2->flags)
 +              return false;
 +      if (fa1->unsupported_subtlv != fa2->unsupported_subtlv)
 +              return false;
  
        if (!admin_group_cmp(&fa1->admin_group_exclude_any,
                             &fa2->admin_group_exclude_any))
        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
@@@ -146,24 -162,3 +168,24 @@@ char *flex_algo_metric_type_print(char 
        }
        return type_str;
  }
 +
 +bool flex_algo_get_state(struct flex_algos *flex_algos, uint8_t algorithm)
 +{
 +      struct flex_algo *fa = flex_algo_lookup(flex_algos, algorithm);
 +
 +      if (!fa)
 +              return false;
 +
 +      return fa->state;
 +}
 +
 +void flex_algo_set_state(struct flex_algos *flex_algos, uint8_t algorithm,
 +                       bool state)
 +{
 +      struct flex_algo *fa = flex_algo_lookup(flex_algos, algorithm);
 +
 +      if (!fa)
 +              return;
 +
 +      fa->state = state;
 +}
diff --combined lib/flex_algo.h
index 81a0af85b8828130b175d790a0936fadc6293c22,9fc2851603295205fe915aa6239f7f06f4247a0c..e617e7cae849e56c8aaa4da00965b73058e8dd87
@@@ -83,11 -83,6 +83,11 @@@ struct flex_algo 
  #define FLEX_ALGO_IP 0x04
        uint8_t dataplanes;
  
 +      /* True if the Algorithm is locally enabled (ie. a definition has been
 +       * found and is supported).
 +       */
 +      bool state;
 +
        /*
         * This property can be freely extended among different routing
         * protocols. Since Flex-Algo is an IGP protocol agnostic, both IS-IS
@@@ -112,6 -107,7 +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,
@@@ -123,8 -119,4 +124,8 @@@ bool flex_algo_id_valid(uint16_t algori
  char *flex_algo_metric_type_print(char *type_str, size_t sz,
                                  enum flex_algo_metric_type metric_type);
  
 +bool flex_algo_get_state(struct flex_algos *flex_algos, uint8_t algorithm);
 +
 +void flex_algo_set_state(struct flex_algos *flex_algos, uint8_t algorithm,
 +                       bool state);
  #endif /* _FRR_FLEX_ALGO_H */