parent_ri->peer, attr_new, rn);
SET_FLAG(ri->flags, BGP_INFO_VALID);
bgp_info_extra_get(ri);
- ri->extra->parent = parent_ri;
+ ri->extra->parent = bgp_info_lock(parent_ri);
if (parent_ri->extra) {
memcpy(&ri->extra->label, &parent_ri->extra->label,
sizeof(ri->extra->label));
parent_ri->peer, attr_new, rn);
SET_FLAG(ri->flags, BGP_INFO_VALID);
bgp_info_extra_get(ri);
- ri->extra->parent = parent_ri;
+ ri->extra->parent = bgp_info_lock(parent_ri);
if (parent_ri->extra) {
memcpy(&ri->extra->label, &parent_ri->extra->label,
sizeof(ri->extra->label));
setlabels(new, label, num_labels);
bgp_info_extra_get(new);
- new->extra->parent = parent;
+ new->extra->parent = bgp_info_lock(parent);
if (bgp_orig)
new->extra->bgp_orig = bgp_orig;
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--;