diff options
author | Donatas Abraitis <donatas@opensourcerouting.org> | 2023-10-29 21:44:45 +0100 |
---|---|---|
committer | Donatas Abraitis <donatas@opensourcerouting.org> | 2023-10-31 16:22:00 +0100 |
commit | c37119df45bbf4ef713bc10475af2ee06e12f3bf (patch) | |
tree | 56d0bc880f64cfb61425587d47702bb8fb1de665 /bgpd/bgp_packet.c | |
parent | bgpd: Treat EOR as withdrawn to avoid unwanted handling of malformed attrs (diff) | |
download | frr-c37119df45bbf4ef713bc10475af2ee06e12f3bf.tar.xz frr-c37119df45bbf4ef713bc10475af2ee06e12f3bf.zip |
bgpd: Ignore handling NLRIs if we received MP_UNREACH_NLRI
If we receive MP_UNREACH_NLRI, we should stop handling remaining NLRIs if
no mandatory path attributes received.
In other words, if MP_UNREACH_NLRI received, the remaining NLRIs should be handled
as a new data, but without mandatory attributes, it's a malformed packet.
In normal case, this MUST not happen at all, but to avoid crashing bgpd, we MUST
handle that.
Reported-by: Iggy Frankovic <iggyfran@amazon.com>
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
Diffstat (limited to 'bgpd/bgp_packet.c')
-rw-r--r-- | bgpd/bgp_packet.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index a7514a26a..5dc35157e 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -2359,7 +2359,12 @@ static int bgp_update_receive(struct peer_connection *connection, /* Network Layer Reachability Information. */ update_len = end - stream_pnt(s); - if (update_len && attribute_len) { + /* If we received MP_UNREACH_NLRI attribute, but also NLRIs, then + * NLRIs should be handled as a new data. Though, if we received + * NLRIs without mandatory attributes, they should be ignored. + */ + if (update_len && attribute_len && + attr_parse_ret != BGP_ATTR_PARSE_MISSING_MANDATORY) { /* Set NLRI portion to structure. */ nlris[NLRI_UPDATE].afi = AFI_IP; nlris[NLRI_UPDATE].safi = SAFI_UNICAST; |