]> git.puffer.fish Git - mirror/frr.git/commitdiff
staticd: fixed memory leak on shudown 7375/head
authorvdhingra <vdhingra@vmware.com>
Fri, 23 Oct 2020 12:09:24 +0000 (05:09 -0700)
committervdhingra <vdhingra@vmware.com>
Fri, 30 Oct 2020 12:22:36 +0000 (05:22 -0700)
When shutdown triggered, info pointer pointing to
static_route_info was not getting released for
route_table and srcdest_table.

Signed-off-by: vishaldhingra <vdhingra@vmware.com>
staticd/static_memory.h
staticd/static_routes.c
staticd/static_vrf.c

index e9cc7ba4691672e9112557c2c8fda6417f7db835..077cd0f32b9f272e4a0ed40d7af3533fbba80aaa 100644 (file)
@@ -23,6 +23,7 @@
 
 DECLARE_MGROUP(STATIC)
 
+DECLARE_MTYPE(STATIC_ROUTE);
 DECLARE_MTYPE(STATIC_NEXTHOP);
 DECLARE_MTYPE(STATIC_PATH);
 
index d105b2123f31ad9216acfe6a5626b6f37ce068a2..94299e0980c5012e5135a6f513b9ed27d04e29ad 100644 (file)
@@ -35,7 +35,7 @@
 #include "static_zebra.h"
 #include "static_debug.h"
 
-DEFINE_MTYPE_STATIC(STATIC, STATIC_ROUTE, "Static Route Info");
+DEFINE_MTYPE(STATIC, STATIC_ROUTE, "Static Route Info");
 DEFINE_MTYPE(STATIC, STATIC_PATH, "Static Path");
 
 /* Install static path into rib. */
index 39b86787ff60543573fead3f61fca12d7f45b1c7..5ae34257158cca6d0628ea64432874751212b4cd 100644 (file)
@@ -38,6 +38,10 @@ static void zebra_stable_node_cleanup(struct route_table *table,
        struct static_nexthop *nh;
        struct static_path *pn;
        struct static_route_info *si;
+       struct route_table *src_table;
+       struct route_node *src_node;
+       struct static_path *src_pn;
+       struct static_route_info *src_si;
 
        si = node->info;
 
@@ -51,6 +55,37 @@ static void zebra_stable_node_cleanup(struct route_table *table,
                        static_path_list_del(&si->path_list, pn);
                        XFREE(MTYPE_STATIC_PATH, pn);
                }
+
+               /* clean up for dst table */
+               src_table = srcdest_srcnode_table(node);
+               if (src_table) {
+                       /* This means the route_node is part of the top
+                        * hierarchy and refers to a destination prefix.
+                        */
+                       for (src_node = route_top(src_table); src_node;
+                            src_node = route_next(src_node)) {
+                               src_si = src_node->info;
+
+                               frr_each_safe(static_path_list,
+                                             &src_si->path_list, src_pn) {
+                                       frr_each_safe(static_nexthop_list,
+                                                     &src_pn->nexthop_list,
+                                                     nh) {
+                                               static_nexthop_list_del(
+                                                       &src_pn->nexthop_list,
+                                                       nh);
+                                               XFREE(MTYPE_STATIC_NEXTHOP, nh);
+                                       }
+                                       static_path_list_del(&src_si->path_list,
+                                                            src_pn);
+                                       XFREE(MTYPE_STATIC_PATH, src_pn);
+                               }
+
+                               XFREE(MTYPE_STATIC_ROUTE, src_node->info);
+                       }
+               }
+
+               XFREE(MTYPE_STATIC_ROUTE, node->info);
        }
 }