]> git.puffer.fish Git - matthieu/frr.git/commitdiff
eigrpd: Fix crash in reply receive packet.
authorDonald Sharp <sharpd@cumulusnetworks.com>
Sun, 29 Oct 2017 12:28:01 +0000 (08:28 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Sun, 29 Oct 2017 12:28:01 +0000 (08:28 -0400)
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>
eigrpd/eigrp_reply.c

index 8dbd1a5b35b9bea854e8a8d58e39ae317d3aecf1..0ccffde72bf0e6f096f13cae025f3bdf5436df4e 100644 (file)
@@ -149,49 +149,56 @@ void eigrp_reply_receive(struct eigrp *eigrp, struct ip *iph,
 
        while (s->endp > s->getp) {
                type = stream_getw(s);
-               if (type == EIGRP_TLV_IPv4_INT) {
-                       struct prefix dest_addr;
-
-                       stream_set_getp(s, s->getp - sizeof(u_int16_t));
-
-                       tlv = eigrp_read_ipv4_tlv(s);
-
-                       dest_addr.family = AF_INET;
-                       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;
-                       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);
+
+               if (type != EIGRP_TLV_IPv4_INT)
+                       continue;
+
+               struct prefix dest_addr;
+
+               stream_set_getp(s, s->getp - sizeof(u_int16_t));
+
+               tlv = eigrp_read_ipv4_tlv(s);
+
+               dest_addr.family = AF_INET;
+               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
+                */
+               if (!dest) {
+                       char buf[PREFIX_STRLEN];
+                       zlog_err("%s: Received prefix %s which we do not know about",
+                                __PRETTY_FUNCTION__,
+                                prefix2str(&dest_addr, buf, strlen(buf)));
+                       continue;
+               }
+
+               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);
 }