]> git.proxmox.com Git - mirror_frr.git/commitdiff
eigrpd: Fix memory leak in FSM
authorDonald Sharp <sharpd@cumulusnetworks.com>
Tue, 22 Aug 2017 19:39:18 +0000 (15:39 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 24 Aug 2017 12:04:20 +0000 (08:04 -0400)
The FSM was never freeing the msg.  Since we
do not have a special queue for it, just don't
allocate the memory.  In the future we can put
this back.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
eigrpd/eigrp_query.c
eigrpd/eigrp_reply.c
eigrpd/eigrp_siaquery.c
eigrpd/eigrp_siareply.c
eigrpd/eigrp_topology.c
eigrpd/eigrp_update.c

index 00f9ee1267dcd5e9f790c85daf046d1b647d00f1..c82c90589b2c3f35e3a5aa3560a55d93bc453ed1 100644 (file)
@@ -125,22 +125,19 @@ void eigrp_query_receive(struct eigrp *eigrp, struct ip *iph,
                        /* If the destination exists (it should, but one never
                         * know)*/
                        if (dest != NULL) {
-                               struct eigrp_fsm_action_message *msg;
-                               msg = XCALLOC(MTYPE_EIGRP_FSM_MSG,
-                                             sizeof(struct
-                                                    eigrp_fsm_action_message));
+                               struct eigrp_fsm_action_message msg;
                                struct eigrp_neighbor_entry *entry =
                                        eigrp_prefix_entry_lookup(dest->entries,
                                                                  nbr);
-                               msg->packet_type = EIGRP_OPC_QUERY;
-                               msg->eigrp = eigrp;
-                               msg->data_type = EIGRP_TLV_IPv4_INT;
-                               msg->adv_router = nbr;
-                               msg->data.ipv4_int_type = tlv;
-                               msg->entry = entry;
-                               msg->prefix = dest;
-                               int event = eigrp_get_fsm_event(msg);
-                               eigrp_fsm_event(msg, event);
+                               msg.packet_type = EIGRP_OPC_QUERY;
+                               msg.eigrp = eigrp;
+                               msg.data_type = EIGRP_TLV_IPv4_INT;
+                               msg.adv_router = nbr;
+                               msg.data.ipv4_int_type = tlv;
+                               msg.entry = entry;
+                               msg.prefix = dest;
+                               int event = eigrp_get_fsm_event(&msg);
+                               eigrp_fsm_event(&msg, event);
                        }
                        eigrp_IPv4_InternalTLV_free(tlv);
                        break;
index e59db803936114f3bb7754fdc267f14d46d35cfa..4e909283d6e5c9490b41fcf55a781114e3085af4 100644 (file)
@@ -196,9 +196,7 @@ void eigrp_reply_receive(struct eigrp *eigrp, struct ip *iph,
                         */
                        assert(dest);
 
-                       struct eigrp_fsm_action_message *msg;
-                       msg = XCALLOC(MTYPE_EIGRP_FSM_MSG,
-                                     sizeof(struct eigrp_fsm_action_message));
+                       struct eigrp_fsm_action_message msg;
                        struct eigrp_neighbor_entry *entry =
                                eigrp_prefix_entry_lookup(dest->entries, nbr);
 
@@ -237,15 +235,15 @@ void eigrp_reply_receive(struct eigrp *eigrp, struct ip *iph,
                         * End of filtering
                         */
 
-                       msg->packet_type = EIGRP_OPC_REPLY;
-                       msg->eigrp = eigrp;
-                       msg->data_type = EIGRP_TLV_IPv4_INT;
-                       msg->adv_router = nbr;
-                       msg->data.ipv4_int_type = tlv;
-                       msg->entry = entry;
-                       msg->prefix = dest;
-                       int event = eigrp_get_fsm_event(msg);
-                       eigrp_fsm_event(msg, event);
+                       msg.packet_type = EIGRP_OPC_REPLY;
+                       msg.eigrp = eigrp;
+                       msg.data_type = EIGRP_TLV_IPv4_INT;
+                       msg.adv_router = nbr;
+                       msg.data.ipv4_int_type = tlv;
+                       msg.entry = entry;
+                       msg.prefix = dest;
+                       int event = eigrp_get_fsm_event(&msg);
+                       eigrp_fsm_event(&msg, event);
 
 
                        eigrp_IPv4_InternalTLV_free(tlv);
index 30f65ee87dace2dfef4cf8d85b6d88c7af3bf4c6..85b6ca9fe4850de2e662b6139b883870e8f6fd5e 100644 (file)
@@ -94,22 +94,19 @@ void eigrp_siaquery_receive(struct eigrp *eigrp, struct ip *iph,
                        /* If the destination exists (it should, but one never
                         * know)*/
                        if (dest != NULL) {
-                               struct eigrp_fsm_action_message *msg;
-                               msg = XCALLOC(MTYPE_EIGRP_FSM_MSG,
-                                             sizeof(struct
-                                                    eigrp_fsm_action_message));
+                               struct eigrp_fsm_action_message msg;
                                struct eigrp_neighbor_entry *entry =
                                        eigrp_prefix_entry_lookup(dest->entries,
                                                                  nbr);
-                               msg->packet_type = EIGRP_OPC_SIAQUERY;
-                               msg->eigrp = eigrp;
-                               msg->data_type = EIGRP_TLV_IPv4_INT;
-                               msg->adv_router = nbr;
-                               msg->data.ipv4_int_type = tlv;
-                               msg->entry = entry;
-                               msg->prefix = dest;
-                               int event = eigrp_get_fsm_event(msg);
-                               eigrp_fsm_event(msg, event);
+                               msg.packet_type = EIGRP_OPC_SIAQUERY;
+                               msg.eigrp = eigrp;
+                               msg.data_type = EIGRP_TLV_IPv4_INT;
+                               msg.adv_router = nbr;
+                               msg.data.ipv4_int_type = tlv;
+                               msg.entry = entry;
+                               msg.prefix = dest;
+                               int event = eigrp_get_fsm_event(&msg);
+                               eigrp_fsm_event(&msg, event);
                        }
                        eigrp_IPv4_InternalTLV_free(tlv);
                }
index 3050b910324990866e9a67298950df6bff371794..c03a34322eee7886b779b9b085d7b10ef365999f 100644 (file)
@@ -93,22 +93,19 @@ void eigrp_siareply_receive(struct eigrp *eigrp, struct ip *iph,
                        /* If the destination exists (it should, but one never
                         * know)*/
                        if (dest != NULL) {
-                               struct eigrp_fsm_action_message *msg;
-                               msg = XCALLOC(MTYPE_EIGRP_FSM_MSG,
-                                             sizeof(struct
-                                                    eigrp_fsm_action_message));
+                               struct eigrp_fsm_action_message msg;
                                struct eigrp_neighbor_entry *entry =
                                        eigrp_prefix_entry_lookup(dest->entries,
                                                                  nbr);
-                               msg->packet_type = EIGRP_OPC_SIAQUERY;
-                               msg->eigrp = eigrp;
-                               msg->data_type = EIGRP_TLV_IPv4_INT;
-                               msg->adv_router = nbr;
-                               msg->data.ipv4_int_type = tlv;
-                               msg->entry = entry;
-                               msg->prefix = dest;
-                               int event = eigrp_get_fsm_event(msg);
-                               eigrp_fsm_event(msg, event);
+                               msg.packet_type = EIGRP_OPC_SIAQUERY;
+                               msg.eigrp = eigrp;
+                               msg.data_type = EIGRP_TLV_IPv4_INT;
+                               msg.adv_router = nbr;
+                               msg.data.ipv4_int_type = tlv;
+                               msg.entry = entry;
+                               msg.prefix = dest;
+                               int event = eigrp_get_fsm_event(&msg);
+                               eigrp_fsm_event(&msg, event);
                        }
                        eigrp_IPv4_InternalTLV_free(tlv);
                }
index 50d83430a8e8cc2852507670e2e1dce4e09443b9..f78a43739db3099564041e3843f8fc523a1b5d8f 100644 (file)
@@ -486,22 +486,19 @@ void eigrp_topology_neighbor_down(struct eigrp *eigrp,
        for (ALL_LIST_ELEMENTS(eigrp->topology_table, node1, node11, prefix)) {
                for (ALL_LIST_ELEMENTS(prefix->entries, node2, node22, entry)) {
                        if (entry->adv_router == nbr) {
-                               struct eigrp_fsm_action_message *msg;
-                               msg = XCALLOC(MTYPE_EIGRP_FSM_MSG,
-                                             sizeof(struct
-                                                    eigrp_fsm_action_message));
+                               struct eigrp_fsm_action_message msg;
                                struct TLV_IPv4_Internal_type *tlv =
                                        eigrp_IPv4_InternalTLV_new();
                                tlv->metric.delay = EIGRP_MAX_METRIC;
-                               msg->packet_type = EIGRP_OPC_UPDATE;
-                               msg->eigrp = eigrp;
-                               msg->data_type = EIGRP_TLV_IPv4_INT;
-                               msg->adv_router = nbr;
-                               msg->data.ipv4_int_type = tlv;
-                               msg->entry = entry;
-                               msg->prefix = prefix;
-                               int event = eigrp_get_fsm_event(msg);
-                               eigrp_fsm_event(msg, event);
+                               msg.packet_type = EIGRP_OPC_UPDATE;
+                               msg.eigrp = eigrp;
+                               msg.data_type = EIGRP_TLV_IPv4_INT;
+                               msg.adv_router = nbr;
+                               msg.data.ipv4_int_type = tlv;
+                               msg.entry = entry;
+                               msg.prefix = prefix;
+                               int event = eigrp_get_fsm_event(&msg);
+                               eigrp_fsm_event(&msg, event);
                        }
                }
        }
index 2934c6c652c3b44c412e32972b858e368af65026..a3d6210e714ed170c81644b15de035d8763a4cd9 100644 (file)
@@ -132,24 +132,22 @@ static void eigrp_update_receive_GR_ask(struct eigrp *eigrp,
 
 
                /* prepare message for FSM */
-               struct eigrp_fsm_action_message *fsm_msg;
-               fsm_msg = XCALLOC(MTYPE_EIGRP_FSM_MSG,
-                                 sizeof(struct eigrp_fsm_action_message));
+               struct eigrp_fsm_action_message fsm_msg;
 
                struct eigrp_neighbor_entry *entry =
                        eigrp_prefix_entry_lookup(prefix->entries, nbr);
 
-               fsm_msg->packet_type = EIGRP_OPC_UPDATE;
-               fsm_msg->eigrp = eigrp;
-               fsm_msg->data_type = EIGRP_TLV_IPv4_INT;
-               fsm_msg->adv_router = nbr;
-               fsm_msg->data.ipv4_int_type = tlv_max;
-               fsm_msg->entry = entry;
-               fsm_msg->prefix = prefix;
+               fsm_msg.packet_type = EIGRP_OPC_UPDATE;
+               fsm_msg.eigrp = eigrp;
+               fsm_msg.data_type = EIGRP_TLV_IPv4_INT;
+               fsm_msg.adv_router = nbr;
+               fsm_msg.data.ipv4_int_type = tlv_max;
+               fsm_msg.entry = entry;
+               fsm_msg.prefix = prefix;
 
                /* send message to FSM */
-               int event = eigrp_get_fsm_event(fsm_msg);
-               eigrp_fsm_event(fsm_msg, event);
+               int event = eigrp_get_fsm_event(&fsm_msg);
+               eigrp_fsm_event(&fsm_msg, event);
 
                /* free memory used by TLV */
                eigrp_IPv4_InternalTLV_free(tlv_max);
@@ -311,23 +309,20 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph,
                                        remove_received_prefix_gr(nbr_prefixes,
                                                                  dest);
 
-                               struct eigrp_fsm_action_message *msg;
-                               msg = XCALLOC(MTYPE_EIGRP_FSM_MSG,
-                                             sizeof(struct
-                                                    eigrp_fsm_action_message));
+                               struct eigrp_fsm_action_message msg;
                                struct eigrp_neighbor_entry *entry =
                                        eigrp_prefix_entry_lookup(dest->entries,
                                                                  nbr);
 
-                               msg->packet_type = EIGRP_OPC_UPDATE;
-                               msg->eigrp = eigrp;
-                               msg->data_type = EIGRP_TLV_IPv4_INT;
-                               msg->adv_router = nbr;
-                               msg->data.ipv4_int_type = tlv;
-                               msg->entry = entry;
-                               msg->prefix = dest;
-                               int event = eigrp_get_fsm_event(msg);
-                               eigrp_fsm_event(msg, event);
+                               msg.packet_type = EIGRP_OPC_UPDATE;
+                               msg.eigrp = eigrp;
+                               msg.data_type = EIGRP_TLV_IPv4_INT;
+                               msg.adv_router = nbr;
+                               msg.data.ipv4_int_type = tlv;
+                               msg.entry = entry;
+                               msg.prefix = dest;
+                               int event = eigrp_get_fsm_event(&msg);
+                               eigrp_fsm_event(&msg, event);
                        } else {
                                /*Here comes topology information save*/
                                pe = eigrp_prefix_entry_new();
@@ -978,25 +973,22 @@ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr)
                                pe->destination_ipv4->prefixlen;
 
                        /* prepare message for FSM */
-                       struct eigrp_fsm_action_message *fsm_msg;
-                       fsm_msg = XCALLOC(
-                               MTYPE_EIGRP_FSM_MSG,
-                               sizeof(struct eigrp_fsm_action_message));
+                       struct eigrp_fsm_action_message fsm_msg;
 
                        struct eigrp_neighbor_entry *entry =
                                eigrp_prefix_entry_lookup(pe->entries, nbr);
 
-                       fsm_msg->packet_type = EIGRP_OPC_UPDATE;
-                       fsm_msg->eigrp = e;
-                       fsm_msg->data_type = EIGRP_TLV_IPv4_INT;
-                       fsm_msg->adv_router = nbr;
-                       fsm_msg->data.ipv4_int_type = tlv_max;
-                       fsm_msg->entry = entry;
-                       fsm_msg->prefix = pe;
+                       fsm_msg.packet_type = EIGRP_OPC_UPDATE;
+                       fsm_msg.eigrp = e;
+                       fsm_msg.data_type = EIGRP_TLV_IPv4_INT;
+                       fsm_msg.adv_router = nbr;
+                       fsm_msg.data.ipv4_int_type = tlv_max;
+                       fsm_msg.entry = entry;
+                       fsm_msg.prefix = pe;
 
                        /* send message to FSM */
-                       int event = eigrp_get_fsm_event(fsm_msg);
-                       eigrp_fsm_event(fsm_msg, event);
+                       int event = eigrp_get_fsm_event(&fsm_msg);
+                       eigrp_fsm_event(&fsm_msg, event);
 
                        /* free memory used by TLV */
                        eigrp_IPv4_InternalTLV_free(tlv_max);