Skip to content

Commit

Permalink
Merge pull request FRRouting#13338 from FRRouting/mergify/bp/stable/8…
Browse files Browse the repository at this point in the history
….5/pr-13329

bgpd: Fix for ain->attr corruption during path update (backport FRRouting#13329)
  • Loading branch information
Jafaral authored Apr 20, 2023
2 parents 165ed0b + ea004fb commit 16f8b0f
Showing 1 changed file with 23 additions and 7 deletions.
30 changes: 23 additions & 7 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -4031,17 +4031,24 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
if (has_valid_label)
assert(label != NULL);

/* Update overlay index of the attribute */
if (afi == AFI_L2VPN && evpn)
memcpy(&attr->evpn_overlay, evpn,
sizeof(struct bgp_route_evpn));

/* When peer's soft reconfiguration enabled. Record input packet in
Adj-RIBs-In. */
if (!soft_reconfig
&& CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
&& peer != bgp->peer_self)
if (!soft_reconfig &&
CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG) &&
peer != bgp->peer_self) {
/*
* If the trigger is not from soft_reconfig and if
* PEER_FLAG_SOFT_RECONFIG is enabled for the peer, then attr
* will not be interned. In which case, it is ok to update the
* attr->evpn_overlay, so that, this can be stored in adj_in.
*/
if ((afi == AFI_L2VPN) && evpn) {
memcpy(&attr->evpn_overlay, evpn,
sizeof(struct bgp_route_evpn));
}
bgp_adj_in_set(dest, peer, attr, addpath_id);
}

/* Update permitted loop count */
if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN))
Expand Down Expand Up @@ -4169,6 +4176,15 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
}

new_attr = *attr;
/*
* If bgp_update is called with soft_reconfig set then
* attr is interned. In this case, do not overwrite the
* attr->evpn_overlay with evpn directly. Instead memcpy
* evpn to new_atr.evpn_overlay before it is interned.
*/
if (soft_reconfig && (afi == AFI_L2VPN) && evpn)
memcpy(&new_attr.evpn_overlay, evpn,
sizeof(struct bgp_route_evpn));

/* Apply incoming route-map.
* NB: new_attr may now contain newly allocated values from route-map
Expand Down

0 comments on commit 16f8b0f

Please sign in to comment.