diff options
author | vdhingra <vdhingra@vmware.com> | 2020-10-23 14:09:24 +0200 |
---|---|---|
committer | vdhingra <vdhingra@vmware.com> | 2020-10-30 13:22:36 +0100 |
commit | 00fd790f1f1ae7f40037749eba24d1211426a244 (patch) | |
tree | 26fffe8c9115d45e8fe79813f993c77d7e43ebd3 /staticd | |
parent | Merge pull request #7372 from mjstapp/fix_ntoa_ripd (diff) | |
download | frr-00fd790f1f1ae7f40037749eba24d1211426a244.tar.xz frr-00fd790f1f1ae7f40037749eba24d1211426a244.zip |
staticd: fixed memory leak on shudown
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>
Diffstat (limited to 'staticd')
-rw-r--r-- | staticd/static_memory.h | 1 | ||||
-rw-r--r-- | staticd/static_routes.c | 2 | ||||
-rw-r--r-- | staticd/static_vrf.c | 35 |
3 files changed, 37 insertions, 1 deletions
diff --git a/staticd/static_memory.h b/staticd/static_memory.h index e9cc7ba46..077cd0f32 100644 --- a/staticd/static_memory.h +++ b/staticd/static_memory.h @@ -23,6 +23,7 @@ DECLARE_MGROUP(STATIC) +DECLARE_MTYPE(STATIC_ROUTE); DECLARE_MTYPE(STATIC_NEXTHOP); DECLARE_MTYPE(STATIC_PATH); diff --git a/staticd/static_routes.c b/staticd/static_routes.c index d105b2123..94299e098 100644 --- a/staticd/static_routes.c +++ b/staticd/static_routes.c @@ -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. */ diff --git a/staticd/static_vrf.c b/staticd/static_vrf.c index 39b86787f..5ae342571 100644 --- a/staticd/static_vrf.c +++ b/staticd/static_vrf.c @@ -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); } } |