summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonnie Savage (dsavage) <dsavage@cisco.com>2017-08-19 21:32:26 -0400
committerDonnie Savage (dsavage) <dsavage@cisco.com>2017-08-19 21:45:49 -0400
commitc283f389d12116559ef1acb2ed09c320842959da (patch)
tree3868e780de6090a61be49dfb97228bb981ee3f88
parentbd8110e50ca201ce7711190d65759f89d5084068 (diff)
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>
-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 3bca444ab7..00f9ee1267 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 7a7b1dd5d6..d0c6520c4e 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);
+ }
}
}