mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 12:41:21 +00:00
Merge pull request #12540 from manojvn/489527
ospf6d: Fixing memory leak in ospf6_summary_add_aggr_route_and_blackh…
This commit is contained in:
commit
aaa18e0e6f
@ -1585,7 +1585,11 @@ ospf6_asbr_summary_remove_lsa_and_route(struct ospf6 *ospf6,
|
|||||||
zlog_debug(
|
zlog_debug(
|
||||||
"%s: Remove the blackhole route",
|
"%s: Remove the blackhole route",
|
||||||
__func__);
|
__func__);
|
||||||
|
|
||||||
ospf6_zebra_route_update_remove(aggr->route, ospf6);
|
ospf6_zebra_route_update_remove(aggr->route, ospf6);
|
||||||
|
if (aggr->route->route_option)
|
||||||
|
XFREE(MTYPE_OSPF6_EXTERNAL_INFO,
|
||||||
|
aggr->route->route_option);
|
||||||
ospf6_route_delete(aggr->route);
|
ospf6_route_delete(aggr->route);
|
||||||
aggr->route = NULL;
|
aggr->route = NULL;
|
||||||
}
|
}
|
||||||
@ -2736,8 +2740,13 @@ ospf6_summary_add_aggr_route_and_blackhole(struct ospf6 *ospf6,
|
|||||||
struct ospf6_external_aggr_rt *aggr)
|
struct ospf6_external_aggr_rt *aggr)
|
||||||
{
|
{
|
||||||
struct ospf6_route *rt_aggr;
|
struct ospf6_route *rt_aggr;
|
||||||
|
struct ospf6_route *old_rt = NULL;
|
||||||
struct ospf6_external_info *info;
|
struct ospf6_external_info *info;
|
||||||
|
|
||||||
|
/* Check if a route is already present. */
|
||||||
|
if (aggr->route)
|
||||||
|
old_rt = aggr->route;
|
||||||
|
|
||||||
/* Create summary route and save it. */
|
/* Create summary route and save it. */
|
||||||
rt_aggr = ospf6_route_create(ospf6);
|
rt_aggr = ospf6_route_create(ospf6);
|
||||||
rt_aggr->type = OSPF6_DEST_TYPE_NETWORK;
|
rt_aggr->type = OSPF6_DEST_TYPE_NETWORK;
|
||||||
@ -2756,6 +2765,16 @@ ospf6_summary_add_aggr_route_and_blackhole(struct ospf6 *ospf6,
|
|||||||
/* Add next-hop to Null interface. */
|
/* Add next-hop to Null interface. */
|
||||||
ospf6_add_route_nexthop_blackhole(rt_aggr);
|
ospf6_add_route_nexthop_blackhole(rt_aggr);
|
||||||
|
|
||||||
|
/* Free the old route, if any. */
|
||||||
|
if (old_rt) {
|
||||||
|
ospf6_zebra_route_update_remove(old_rt, ospf6);
|
||||||
|
|
||||||
|
if (old_rt->route_option)
|
||||||
|
XFREE(MTYPE_OSPF6_EXTERNAL_INFO, old_rt->route_option);
|
||||||
|
|
||||||
|
ospf6_route_delete(old_rt);
|
||||||
|
}
|
||||||
|
|
||||||
ospf6_zebra_route_update_add(rt_aggr, ospf6);
|
ospf6_zebra_route_update_add(rt_aggr, ospf6);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3024,8 +3043,8 @@ static void ospf6_aggr_handle_external_info(void *data)
|
|||||||
(void)ospf6_originate_type5_type7_lsas(rt, ospf6);
|
(void)ospf6_originate_type5_type7_lsas(rt, ospf6);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void ospf6_asbr_summary_config_delete(struct ospf6 *ospf6,
|
||||||
ospf6_asbr_summary_config_delete(struct ospf6 *ospf6, struct route_node *rn)
|
struct route_node *rn)
|
||||||
{
|
{
|
||||||
struct ospf6_external_aggr_rt *aggr = rn->info;
|
struct ospf6_external_aggr_rt *aggr = rn->info;
|
||||||
|
|
||||||
@ -3167,14 +3186,6 @@ void ospf6_external_aggregator_free(struct ospf6_external_aggr_rt *aggr)
|
|||||||
hash_clean(aggr->match_extnl_hash,
|
hash_clean(aggr->match_extnl_hash,
|
||||||
ospf6_aggr_unlink_external_info);
|
ospf6_aggr_unlink_external_info);
|
||||||
|
|
||||||
if (aggr->route) {
|
|
||||||
if (aggr->route->route_option)
|
|
||||||
XFREE(MTYPE_OSPF6_EXTERNAL_INFO,
|
|
||||||
aggr->route->route_option);
|
|
||||||
|
|
||||||
ospf6_route_delete(aggr->route);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IS_OSPF6_DEBUG_AGGR)
|
if (IS_OSPF6_DEBUG_AGGR)
|
||||||
zlog_debug("%s: Release the aggregator Address(%pFX)",
|
zlog_debug("%s: Release the aggregator Address(%pFX)",
|
||||||
__func__,
|
__func__,
|
||||||
|
@ -182,4 +182,6 @@ void ospf6_external_aggregator_free(struct ospf6_external_aggr_rt *aggr);
|
|||||||
void ospf6_unset_all_aggr_flag(struct ospf6 *ospf6);
|
void ospf6_unset_all_aggr_flag(struct ospf6 *ospf6);
|
||||||
void ospf6_fill_aggr_route_details(struct ospf6 *ospf6,
|
void ospf6_fill_aggr_route_details(struct ospf6 *ospf6,
|
||||||
struct ospf6_external_aggr_rt *aggr);
|
struct ospf6_external_aggr_rt *aggr);
|
||||||
|
void ospf6_asbr_summary_config_delete(struct ospf6 *ospf6,
|
||||||
|
struct route_node *rn);
|
||||||
#endif /* OSPF6_ASBR_H */
|
#endif /* OSPF6_ASBR_H */
|
||||||
|
@ -498,6 +498,7 @@ void ospf6_delete(struct ospf6 *o)
|
|||||||
struct route_node *rn = NULL;
|
struct route_node *rn = NULL;
|
||||||
struct ospf6_area *oa;
|
struct ospf6_area *oa;
|
||||||
struct vrf *vrf;
|
struct vrf *vrf;
|
||||||
|
struct ospf6_external_aggr_rt *aggr;
|
||||||
|
|
||||||
QOBJ_UNREG(o);
|
QOBJ_UNREG(o);
|
||||||
|
|
||||||
@ -536,8 +537,11 @@ void ospf6_delete(struct ospf6 *o)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (rn = route_top(o->rt_aggr_tbl); rn; rn = route_next(rn))
|
for (rn = route_top(o->rt_aggr_tbl); rn; rn = route_next(rn))
|
||||||
if (rn->info)
|
if (rn->info) {
|
||||||
ospf6_external_aggregator_free(rn->info);
|
aggr = rn->info;
|
||||||
|
ospf6_asbr_summary_config_delete(o, rn);
|
||||||
|
ospf6_external_aggregator_free(aggr);
|
||||||
|
}
|
||||||
route_table_finish(o->rt_aggr_tbl);
|
route_table_finish(o->rt_aggr_tbl);
|
||||||
|
|
||||||
XFREE(MTYPE_OSPF6_TOP, o->name);
|
XFREE(MTYPE_OSPF6_TOP, o->name);
|
||||||
|
Loading…
Reference in New Issue
Block a user