summaryrefslogtreecommitdiff
path: root/isisd/isis_redist.c
diff options
context:
space:
mode:
authorIgor Ryzhov <iryzhov@nfware.com>2021-05-09 16:09:38 +0300
committerIgor Ryzhov <iryzhov@nfware.com>2021-05-14 17:12:36 +0300
commit46c9042fbc098322c9978fdb440dfa48642ee643 (patch)
tree34689225dba7849dcc3ca3bc3a4727e737216599 /isisd/isis_redist.c
parent8c6482db8ced19032101444ddb19c9c2ae04ec9d (diff)
isisd: fix memleak when deleting area and instance
Release memory for all redistributed route info. Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
Diffstat (limited to 'isisd/isis_redist.c')
-rw-r--r--isisd/isis_redist.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/isisd/isis_redist.c b/isisd/isis_redist.c
index ce0f44bf7a..2f5e490da1 100644
--- a/isisd/isis_redist.c
+++ b/isisd/isis_redist.c
@@ -391,12 +391,19 @@ static void isis_redist_update_zebra_subscriptions(struct isis *isis)
void isis_redist_free(struct isis *isis)
{
+ struct route_node *rn;
int i;
for (i = 0; i < REDIST_PROTOCOL_COUNT; i++) {
if (!isis->ext_info[i])
continue;
+ for (rn = route_top(isis->ext_info[i]); rn;
+ rn = srcdest_route_next(rn)) {
+ if (rn->info)
+ XFREE(MTYPE_ISIS_EXT_INFO, rn->info);
+ }
+
route_table_finish(isis->ext_info[i]);
isis->ext_info[i] = NULL;
}
@@ -504,6 +511,7 @@ void isis_redist_unset(struct isis_area *area, int level, int family, int type)
void isis_redist_area_finish(struct isis_area *area)
{
+ struct route_node *rn;
int protocol;
int level;
int type;
@@ -518,7 +526,15 @@ void isis_redist_area_finish(struct isis_area *area)
redist->redist = 0;
XFREE(MTYPE_ISIS_RMAP_NAME, redist->map_name);
}
+ if (!area->ext_reach[protocol][level])
+ continue;
+ for (rn = route_top(area->ext_reach[protocol][level]);
+ rn; rn = srcdest_route_next(rn)) {
+ if (rn->info)
+ XFREE(MTYPE_ISIS_EXT_INFO, rn->info);
+ }
route_table_finish(area->ext_reach[protocol][level]);
+ area->ext_reach[protocol][level] = NULL;
}
isis_redist_update_zebra_subscriptions(area->isis);