There exists code paths where the rn was being used after free.
This eliminates these code paths.
Fixes: CM-21019
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
SET_FLAG(ri->flags, BGP_INFO_VALID);
bgp_info_extra_get(ri);
ri->extra->parent = bgp_info_lock(parent_ri);
+ bgp_lock_node((struct bgp_node *)parent_ri->net);
if (parent_ri->extra) {
memcpy(&ri->extra->label, &parent_ri->extra->label,
sizeof(ri->extra->label));
SET_FLAG(ri->flags, BGP_INFO_VALID);
bgp_info_extra_get(ri);
ri->extra->parent = bgp_info_lock(parent_ri);
+ bgp_lock_node((struct bgp_node *)parent_ri->net);
if (parent_ri->extra) {
memcpy(&ri->extra->label, &parent_ri->extra->label,
sizeof(ri->extra->label));
int ret = 0;
struct prefix_evpn evp;
char buf[PREFIX_STRLEN];
-
+
build_type5_prefix_from_ip_prefix(&evp, p);
ret = update_evpn_type5_route(bgp_vrf, &evp, src_attr);
if (ret)
setlabels(new, label, num_labels);
new->extra->parent = bgp_info_lock(parent);
-
+ bgp_lock_node((struct bgp_node *)((struct bgp_info *)parent)->net);
if (bgp_orig)
new->extra->bgp_orig = bgp_orig;
if (nexthop_orig)
/* Free bgp route information. */
static void bgp_info_free(struct bgp_info *binfo)
{
+ /* unlink reference to parent, if any. */
+ if (binfo->extra && binfo->extra->parent) {
+ bgp_info_unlock((struct bgp_info *)binfo->extra->parent);
+ bgp_unlock_node((struct bgp_node *)((struct bgp_info *)binfo
+ ->extra->parent)->net);
+ binfo->extra->parent = NULL;
+ }
+
if (binfo->attr)
bgp_attr_unintern(&binfo->attr);
struct bgp_info *bgp_info_unlock(struct bgp_info *binfo)
{
- /* unlink reference to parent, if any. */
- if (binfo->extra && binfo->extra->parent) {
- bgp_info_unlock((struct bgp_info *)binfo->extra->parent);
- binfo->extra->parent = NULL;
- }
assert(binfo && binfo->lock > 0);
binfo->lock--;