mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-06 12:52:49 +00:00
eigrpd: Fix crash in reply receive packet.
When we receive a reply for a prefix we no longer have we should note the issue and move on instead of crashing eigrp. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
68b7dd07d5
commit
b42a4a099a
@ -149,49 +149,56 @@ void eigrp_reply_receive(struct eigrp *eigrp, struct ip *iph,
|
|||||||
|
|
||||||
while (s->endp > s->getp) {
|
while (s->endp > s->getp) {
|
||||||
type = stream_getw(s);
|
type = stream_getw(s);
|
||||||
if (type == EIGRP_TLV_IPv4_INT) {
|
|
||||||
struct prefix dest_addr;
|
|
||||||
|
|
||||||
stream_set_getp(s, s->getp - sizeof(u_int16_t));
|
if (type != EIGRP_TLV_IPv4_INT)
|
||||||
|
continue;
|
||||||
|
|
||||||
tlv = eigrp_read_ipv4_tlv(s);
|
struct prefix dest_addr;
|
||||||
|
|
||||||
dest_addr.family = AF_INET;
|
stream_set_getp(s, s->getp - sizeof(u_int16_t));
|
||||||
dest_addr.u.prefix4 = tlv->destination;
|
|
||||||
dest_addr.prefixlen = tlv->prefix_length;
|
|
||||||
struct eigrp_prefix_entry *dest =
|
|
||||||
eigrp_topology_table_lookup_ipv4(
|
|
||||||
eigrp->topology_table, &dest_addr);
|
|
||||||
/*
|
|
||||||
* Destination must exists
|
|
||||||
*/
|
|
||||||
assert(dest);
|
|
||||||
|
|
||||||
struct eigrp_fsm_action_message msg;
|
tlv = eigrp_read_ipv4_tlv(s);
|
||||||
struct eigrp_nexthop_entry *entry =
|
|
||||||
eigrp_prefix_entry_lookup(dest->entries, nbr);
|
|
||||||
|
|
||||||
if (eigrp_update_prefix_apply(eigrp, ei,
|
dest_addr.family = AF_INET;
|
||||||
EIGRP_FILTER_IN,
|
dest_addr.u.prefix4 = tlv->destination;
|
||||||
&dest_addr)) {
|
dest_addr.prefixlen = tlv->prefix_length;
|
||||||
tlv->metric.delay = EIGRP_MAX_METRIC;
|
struct eigrp_prefix_entry *dest =
|
||||||
}
|
eigrp_topology_table_lookup_ipv4(
|
||||||
/*
|
eigrp->topology_table, &dest_addr);
|
||||||
* End of filtering
|
/*
|
||||||
*/
|
* Destination must exists
|
||||||
|
*/
|
||||||
msg.packet_type = EIGRP_OPC_REPLY;
|
if (!dest) {
|
||||||
msg.eigrp = eigrp;
|
char buf[PREFIX_STRLEN];
|
||||||
msg.data_type = EIGRP_INT;
|
zlog_err("%s: Received prefix %s which we do not know about",
|
||||||
msg.adv_router = nbr;
|
__PRETTY_FUNCTION__,
|
||||||
msg.metrics = tlv->metric;
|
prefix2str(&dest_addr, buf, strlen(buf)));
|
||||||
msg.entry = entry;
|
continue;
|
||||||
msg.prefix = dest;
|
|
||||||
eigrp_fsm_event(&msg);
|
|
||||||
|
|
||||||
|
|
||||||
eigrp_IPv4_InternalTLV_free(tlv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct eigrp_fsm_action_message msg;
|
||||||
|
struct eigrp_nexthop_entry *entry =
|
||||||
|
eigrp_prefix_entry_lookup(dest->entries, nbr);
|
||||||
|
|
||||||
|
if (eigrp_update_prefix_apply(eigrp, ei,
|
||||||
|
EIGRP_FILTER_IN,
|
||||||
|
&dest_addr)) {
|
||||||
|
tlv->metric.delay = EIGRP_MAX_METRIC;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* End of filtering
|
||||||
|
*/
|
||||||
|
|
||||||
|
msg.packet_type = EIGRP_OPC_REPLY;
|
||||||
|
msg.eigrp = eigrp;
|
||||||
|
msg.data_type = EIGRP_INT;
|
||||||
|
msg.adv_router = nbr;
|
||||||
|
msg.metrics = tlv->metric;
|
||||||
|
msg.entry = entry;
|
||||||
|
msg.prefix = dest;
|
||||||
|
eigrp_fsm_event(&msg);
|
||||||
|
|
||||||
|
eigrp_IPv4_InternalTLV_free(tlv);
|
||||||
}
|
}
|
||||||
eigrp_hello_send_ack(nbr);
|
eigrp_hello_send_ack(nbr);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user