diff options
| author | Igor Ryzhov <iryzhov@nfware.com> | 2021-05-09 16:09:38 +0300 | 
|---|---|---|
| committer | Igor Ryzhov <iryzhov@nfware.com> | 2021-05-14 17:12:36 +0300 | 
| commit | 46c9042fbc098322c9978fdb440dfa48642ee643 (patch) | |
| tree | 34689225dba7849dcc3ca3bc3a4727e737216599 /isisd/isis_redist.c | |
| parent | 8c6482db8ced19032101444ddb19c9c2ae04ec9d (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.c | 16 | 
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);  | 
