diff --git a/bgpd/bgp_aspath.c b/bgpd/bgp_aspath.c index 2ae693cd30..89e631d437 100644 --- a/bgpd/bgp_aspath.c +++ b/bgpd/bgp_aspath.c @@ -2169,11 +2169,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) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index c97dbc4fef..a3a8832bd6 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -7252,7 +7252,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); @@ -7652,7 +7652,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; @@ -7670,9 +7670,9 @@ void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi, /* If the bgp instance is being deleted or self peer is deleted * then do not create aggregate route */ - if (CHECK_FLAG(bgp->flags, BGP_FLAG_DELETE_IN_PROGRESS) - || (bgp->peer_self == NULL)) - return; + if (CHECK_FLAG(bgp->flags, BGP_FLAG_DELETE_IN_PROGRESS) || + bgp->peer_self == NULL) + return false; /* Initialize and test routes for MED difference. */ if (aggregate->match_med) @@ -7864,6 +7864,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, @@ -8454,7 +8456,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; } diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index 2afd97c4dd..fd6d0cfe79 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -780,7 +780,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, @@ -889,6 +889,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)) diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index 61cff27e9e..771e48b426 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -4211,8 +4211,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); } } }