Merge pull request #12999 from opensourcerouting/fix/bgp_leaks_random_stuff

bgpd: aggregate routes memory leak for aspath
This commit is contained in:
Donald Sharp 2023-03-16 19:12:55 -04:00 committed by GitHub
commit 090109617e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 13 deletions

View File

@ -2157,11 +2157,15 @@ static void bgp_aggr_aspath_prepare(struct hash_bucket *hb, void *arg)
{
struct aspath *hb_aspath = hb->data;
struct aspath **aggr_aspath = arg;
struct aspath *aspath = NULL;
if (*aggr_aspath)
*aggr_aspath = aspath_aggregate(*aggr_aspath, hb_aspath);
else
if (*aggr_aspath) {
aspath = aspath_aggregate(*aggr_aspath, hb_aspath);
aspath_free(*aggr_aspath);
*aggr_aspath = aspath;
} else {
*aggr_aspath = aspath_dup(hb_aspath);
}
}
void bgp_aggr_aspath_remove(void *arg)

View File

@ -7243,7 +7243,7 @@ static struct bgp_aggregate *bgp_aggregate_new(void)
return XCALLOC(MTYPE_BGP_AGGREGATE, sizeof(struct bgp_aggregate));
}
static void bgp_aggregate_free(struct bgp_aggregate *aggregate)
void bgp_aggregate_free(struct bgp_aggregate *aggregate)
{
XFREE(MTYPE_ROUTE_MAP_NAME, aggregate->suppress_map_name);
route_map_counter_decrement(aggregate->suppress_map);
@ -7646,7 +7646,7 @@ static void bgp_aggregate_med_update(struct bgp_aggregate *aggregate,
}
/* Update an aggregate as routes are added/removed from the BGP table */
void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi,
bool bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi,
safi_t safi, struct bgp_aggregate *aggregate)
{
struct bgp_table *table;
@ -7665,10 +7665,8 @@ void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi,
* then do not create aggregate route
*/
if (CHECK_FLAG(bgp->flags, BGP_FLAG_DELETE_IN_PROGRESS) ||
(bgp->peer_self == NULL)) {
bgp_aggregate_free(aggregate);
return;
}
bgp->peer_self == NULL)
return false;
/* Initialize and test routes for MED difference. */
if (aggregate->match_med)
@ -7860,6 +7858,8 @@ void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi,
bgp_aggregate_install(bgp, afi, safi, p, origin, aspath, community,
ecommunity, lcommunity, atomic_aggregate,
aggregate);
return true;
}
void bgp_aggregate_delete(struct bgp *bgp, const struct prefix *p, afi_t afi,
@ -8502,7 +8502,10 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi,
bgp_dest_set_bgp_aggregate_info(dest, aggregate);
/* Aggregate address insert into BGP routing table. */
bgp_aggregate_route(bgp, &p, afi, safi, aggregate);
if (!bgp_aggregate_route(bgp, &p, afi, safi, aggregate)) {
bgp_aggregate_free(aggregate);
bgp_dest_unlock_node(dest);
}
return CMD_SUCCESS;
}

View File

@ -766,7 +766,7 @@ extern void bgp_config_write_distance(struct vty *, struct bgp *, afi_t,
extern void bgp_aggregate_delete(struct bgp *bgp, const struct prefix *p,
afi_t afi, safi_t safi,
struct bgp_aggregate *aggregate);
extern void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p,
extern bool bgp_aggregate_route(struct bgp *bgp, const struct prefix *p,
afi_t afi, safi_t safi,
struct bgp_aggregate *aggregate);
extern void bgp_aggregate_increment(struct bgp *bgp, const struct prefix *p,
@ -877,6 +877,7 @@ extern void bgp_path_info_free_with_caller(const char *caller,
extern void bgp_path_info_add_with_caller(const char *caller,
struct bgp_dest *dest,
struct bgp_path_info *pi);
extern void bgp_aggregate_free(struct bgp_aggregate *aggregate);
#define bgp_path_info_add(A, B) \
bgp_path_info_add_with_caller(__func__, (A), (B))
#define bgp_path_info_free(B) bgp_path_info_free_with_caller(__func__, (B))

View File

@ -4266,8 +4266,8 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name,
inet_ntop(bn_p->family,
&bn_p->u.prefix, buf,
sizeof(buf)));
bgp_aggregate_route(bgp, bn_p, afi, safi,
aggregate);
(void)bgp_aggregate_route(bgp, bn_p, afi, safi,
aggregate);
}
}
}