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>
This commit is contained in:
Donnie Savage (dsavage) 2017-08-19 21:32:26 -04:00
parent bd8110e50c
commit c283f389d1
2 changed files with 32 additions and 6 deletions

View file

@ -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);

View file

@ -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);
}
}
}