summaryrefslogtreecommitdiffstats
path: root/eigrpd
diff options
context:
space:
mode:
authorDonnie Savage (dsavage) <dsavage@cisco.com>2017-08-20 03:32:26 +0200
committerDonnie Savage (dsavage) <dsavage@cisco.com>2017-08-20 03:45:49 +0200
commitc283f389d12116559ef1acb2ed09c320842959da (patch)
tree3868e780de6090a61be49dfb97228bb981ee3f88 /eigrpd
parentMerge pull request #1011 from donaldsharp/tlv_crash (diff)
downloadfrr-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.c19
-rw-r--r--eigrpd/eigrp_update.c19
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);
+ }
}
}