]> git.proxmox.com Git - mirror_frr.git/commitdiff
eigrpd: Fix memory leaks and remove dead/unused functions
authorDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 24 Sep 2018 00:41:49 +0000 (20:41 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 24 Sep 2018 02:42:26 +0000 (22:42 -0400)
During shutdown we were not properly cleaning up some memory
as reported by valgrind.  Additionally during cleanup operations
I noticed that there were some dead/unused functions remove/reduce.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
eigrpd/eigrp_topology.c
eigrpd/eigrp_topology.h
eigrpd/eigrpd.c

index 80814d6d367da49488a6422c20f7ae94a9dca812..3520972731b646911dca7f040912685582e3176e 100644 (file)
@@ -118,16 +118,9 @@ struct eigrp_nexthop_entry *eigrp_nexthop_entry_new()
  * Freeing topology table list
  */
 void eigrp_topology_free(struct route_table *table)
-{
-       route_table_finish(table);
-}
-
-/*
- * Deleting all topology nodes in table
- */
-void eigrp_topology_cleanup(struct route_table *table)
 {
        eigrp_topology_delete_all(table);
+       route_table_finish(table);
 }
 
 /*
@@ -181,6 +174,8 @@ void eigrp_prefix_entry_delete(struct route_table *table,
                               struct eigrp_prefix_entry *pe)
 {
        struct eigrp *eigrp = eigrp_lookup();
+       struct eigrp_nexthop_entry *ne;
+       struct listnode *node, *nnode;
        struct route_node *rn;
 
        if (!eigrp)
@@ -196,9 +191,12 @@ void eigrp_prefix_entry_delete(struct route_table *table,
         */
        listnode_delete(eigrp->topology_changes_internalIPV4, pe);
 
+       for (ALL_LIST_ELEMENTS(pe->entries, node, nnode, ne))
+               eigrp_nexthop_entry_delete(pe, ne);
        list_delete_and_null(&pe->entries);
        list_delete_and_null(&pe->rij);
        eigrp_zebra_route_delete(pe->destination);
+       prefix_free(pe->destination);
 
        rn->info = NULL;
        route_unlock_node(rn); // Lookup above
@@ -237,18 +235,6 @@ void eigrp_topology_delete_all(struct route_table *topology)
        }
 }
 
-/*
- * Return 0 if topology is not empty
- * otherwise return 1
- */
-unsigned int eigrp_topology_table_isempty(struct list *topology)
-{
-       if (topology->count)
-               return 1;
-       else
-               return 0;
-}
-
 struct eigrp_prefix_entry *
 eigrp_topology_table_lookup_ipv4(struct route_table *table,
                                 struct prefix *address)
index af39f7f1aa03d678fe5710f0f1f1dbcd7e694435..16bf2261ccb9484e576b6ff5ae51de56f80f1086 100644 (file)
@@ -38,7 +38,6 @@ extern void eigrp_topology_init(struct route_table *table);
 extern struct eigrp_prefix_entry *eigrp_prefix_entry_new(void);
 extern struct eigrp_nexthop_entry *eigrp_nexthop_entry_new(void);
 extern void eigrp_topology_free(struct route_table *table);
-extern void eigrp_topology_cleanup(struct route_table *table);
 extern void eigrp_prefix_entry_add(struct route_table *table,
                                   struct eigrp_prefix_entry *pe);
 extern void eigrp_nexthop_entry_add(struct eigrp_prefix_entry *,
@@ -48,7 +47,6 @@ extern void eigrp_prefix_entry_delete(struct route_table *table,
 extern void eigrp_nexthop_entry_delete(struct eigrp_prefix_entry *,
                                       struct eigrp_nexthop_entry *);
 extern void eigrp_topology_delete_all(struct route_table *table);
-extern unsigned int eigrp_topology_table_isempty(struct list *);
 extern struct eigrp_prefix_entry *
 eigrp_topology_table_lookup_ipv4(struct route_table *table, struct prefix *p);
 extern struct list *eigrp_topology_get_successor(struct eigrp_prefix_entry *);
index b30f14f748f15c2fcc6b9fb2167169d7e65c9d7f..e9f81fc1c566c277de7b4e4e0c0cd83aab8beeef 100644 (file)
@@ -62,9 +62,7 @@ static struct eigrp_master eigrp_master;
 
 struct eigrp_master *eigrp_om;
 
-static void eigrp_delete(struct eigrp *);
 static struct eigrp *eigrp_new(const char *);
-static void eigrp_add(struct eigrp *);
 
 extern struct zclient *zclient;
 extern struct in_addr router_id_zebra;
@@ -203,16 +201,6 @@ static struct eigrp *eigrp_new(const char *AS)
        return eigrp;
 }
 
-static void eigrp_add(struct eigrp *eigrp)
-{
-       listnode_add(eigrp_om->eigrp, eigrp);
-}
-
-static void eigrp_delete(struct eigrp *eigrp)
-{
-       listnode_delete(eigrp_om->eigrp, eigrp);
-}
-
 struct eigrp *eigrp_get(const char *AS)
 {
        struct eigrp *eigrp;
@@ -220,7 +208,7 @@ struct eigrp *eigrp_get(const char *AS)
        eigrp = eigrp_lookup();
        if (eigrp == NULL) {
                eigrp = eigrp_new(AS);
-               eigrp_add(eigrp);
+               listnode_add(eigrp_om->eigrp, eigrp);
        }
 
        return eigrp;
@@ -281,7 +269,6 @@ void eigrp_finish_final(struct eigrp *eigrp)
        list_delete_and_null(&eigrp->eiflist);
        list_delete_and_null(&eigrp->oi_write_q);
 
-       eigrp_topology_cleanup(eigrp->topology_table);
        eigrp_topology_free(eigrp->topology_table);
 
        eigrp_nbr_delete(eigrp->neighbor_self);
@@ -289,8 +276,9 @@ void eigrp_finish_final(struct eigrp *eigrp)
        list_delete_and_null(&eigrp->topology_changes_externalIPV4);
        list_delete_and_null(&eigrp->topology_changes_internalIPV4);
 
-       eigrp_delete(eigrp);
+       listnode_delete(eigrp_om->eigrp, eigrp);
 
+       stream_free(eigrp->ibuf);
        XFREE(MTYPE_EIGRP_TOP, eigrp);
 }