diff options
author | Donnie Savage (dsavage) <dsavage@cisco.com> | 2017-08-20 03:32:26 +0200 |
---|---|---|
committer | Donnie Savage (dsavage) <dsavage@cisco.com> | 2017-08-20 03:45:49 +0200 |
commit | c283f389d12116559ef1acb2ed09c320842959da (patch) | |
tree | 3868e780de6090a61be49dfb97228bb981ee3f88 /eigrpd | |
parent | Merge pull request #1011 from donaldsharp/tlv_crash (diff) | |
download | frr-c283f389d12116559ef1acb2ed09c320842959da.tar.xz frr-c283f389d12116559ef1acb2ed09c320842959da.zip |
eigrpd: fix crash when external route is received
When an external route is received, eigrpd will crash. For now,
quietly discard the TLV. Work must be done to handle tlv
processing and changes needed to FSM so it understands an
external should not be chooses if an internal exist.
Signed-off-by: Donnie Savage <diivious@hotmail.com>
Diffstat (limited to 'eigrpd')
-rw-r--r-- | eigrpd/eigrp_query.c | 19 | ||||
-rw-r--r-- | eigrpd/eigrp_update.c | 19 |
2 files changed, 32 insertions, 6 deletions
diff --git a/eigrpd/eigrp_query.c b/eigrpd/eigrp_query.c index 3bca444ab..00f9ee126 100644 --- a/eigrpd/eigrp_query.c +++ b/eigrpd/eigrp_query.c @@ -91,8 +91,10 @@ void eigrp_query_receive(struct eigrp *eigrp, struct ip *iph, { struct eigrp_neighbor *nbr; struct TLV_IPv4_Internal_type *tlv; + struct prefix_ipv4 dest_addr; u_int16_t type; + u_int16_t length; /* increment statistics. */ ei->query_in++; @@ -107,9 +109,8 @@ void eigrp_query_receive(struct eigrp *eigrp, struct ip *iph, while (s->endp > s->getp) { type = stream_getw(s); - if (type == EIGRP_TLV_IPv4_INT) { - struct prefix_ipv4 dest_addr; - + switch (type) { + case EIGRP_TLV_IPv4_INT: stream_set_getp(s, s->getp - sizeof(u_int16_t)); tlv = eigrp_read_ipv4_tlv(s); @@ -142,6 +143,18 @@ void eigrp_query_receive(struct eigrp *eigrp, struct ip *iph, eigrp_fsm_event(msg, event); } eigrp_IPv4_InternalTLV_free(tlv); + break; + + case EIGRP_TLV_IPv4_EXT: + /* DVS: processing of external routes needs packet and fsm work. + * for now, lets just not creash the box + */ + default: + length = stream_getw(s); + // -2 for type, -2 for len + for (length-=4; length ; length--) { + (void)stream_getc(s); + } } } eigrp_hello_send_ack(nbr); diff --git a/eigrpd/eigrp_update.c b/eigrpd/eigrp_update.c index 7a7b1dd5d..d0c6520c4 100644 --- a/eigrpd/eigrp_update.c +++ b/eigrpd/eigrp_update.c @@ -169,9 +169,11 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph, struct eigrp_neighbor_entry *ne; u_int32_t flags; u_int16_t type; + u_int16_t length; u_char same; struct access_list *alist; struct prefix_list *plist; + struct prefix_ipv4 dest_addr; struct eigrp *e; u_char graceful_restart; u_char graceful_restart_final; @@ -287,9 +289,8 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph, /*If there is topology information*/ while (s->endp > s->getp) { type = stream_getw(s); - if (type == EIGRP_TLV_IPv4_INT) { - struct prefix_ipv4 dest_addr; - + switch (type) { + case EIGRP_TLV_IPv4_INT: stream_set_getp(s, s->getp - sizeof(u_int16_t)); tlv = eigrp_read_ipv4_tlv(s); @@ -436,6 +437,18 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph, pe); } eigrp_IPv4_InternalTLV_free(tlv); + break; + + case EIGRP_TLV_IPv4_EXT: + /* DVS: processing of external routes needs packet and fsm work. + * for now, lets just not creash the box + */ + default: + length = stream_getw(s); + // -2 for type, -2 for len + for (length-=4; length ; length--) { + (void)stream_getc(s); + } } } |