]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Squash some more memory leaks
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 2 Aug 2017 17:16:51 +0000 (13:16 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 2 Aug 2017 19:39:10 +0000 (15:39 -0400)
When a interface is flapped we were leaking some memory
associated with link lists.  Especially in the jp_agg
code.  If your network was/is stable and you are not
running at any scale you probably would not see this
as impactful at all.

Ticket: CM-16392
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_iface.c
pimd/pim_igmp.c
pimd/pim_instance.c
pimd/pim_jp_agg.c
pimd/pim_msdp.c
pimd/pim_oil.c
pimd/pim_ssmpingd.c

index 221ca2f24d118ba819765942ce59f66da88fcddf..9fdbf7b3e3b8932c88050528a7c5023a0629cc6d 100644 (file)
@@ -44,6 +44,7 @@
 #include "pim_ssmpingd.h"
 #include "pim_rp.h"
 #include "pim_nht.h"
+#include "pim_jp_agg.h"
 
 static void pim_if_igmp_join_del_all(struct interface *ifp);
 static int igmp_join_sock(const char *ifname, ifindex_t ifindex,
@@ -83,6 +84,9 @@ static void *if_list_clean(struct pim_interface *pim_ifp)
        if (pim_ifp->upstream_switch_list)
                list_delete(pim_ifp->upstream_switch_list);
 
+       if (pim_ifp->sec_addr_list)
+               list_delete(pim_ifp->sec_addr_list);
+
        while ((ch = RB_ROOT(pim_ifchannel_rb,
                             &pim_ifp->ifchannel_rb)) != NULL)
                pim_ifchannel_delete(ch);
@@ -163,6 +167,9 @@ struct pim_interface *pim_if_new(struct interface *ifp, int igmp, int pim)
                         __FILE__, __PRETTY_FUNCTION__);
                return if_list_clean(pim_ifp);
        }
+       pim_ifp->upstream_switch_list->del =
+               (void (*)(void *))pim_jp_agg_group_list_free;
+       pim_ifp->upstream_switch_list->cmp = pim_jp_agg_group_list_cmp;
 
        RB_INIT(pim_ifchannel_rb, &pim_ifp->ifchannel_rb);
 
@@ -198,6 +205,7 @@ void pim_if_delete(struct interface *ifp)
        list_delete(pim_ifp->igmp_socket_list);
        list_delete(pim_ifp->pim_neighbor_list);
        list_delete(pim_ifp->upstream_switch_list);
+       list_delete(pim_ifp->sec_addr_list);
 
        while ((ch = RB_ROOT(pim_ifchannel_rb,
                             &pim_ifp->ifchannel_rb)) != NULL)
index ea8eff4d59064b4ea5fdbd73cf0d05717f33a054..3a870374c044c6e7a4924d6397de106e30d30510 100644 (file)
@@ -696,7 +696,7 @@ void igmp_startup_mode_on(struct igmp_sock *igmp)
 
 static void igmp_group_free(struct igmp_group *group)
 {
-       list_free(group->group_source_list);
+       list_delete(group->group_source_list);
 
        XFREE(MTYPE_PIM_IGMP_GROUP, group);
 }
@@ -748,7 +748,7 @@ void igmp_sock_free(struct igmp_sock *igmp)
        zassert(igmp->igmp_group_list);
        zassert(!listcount(igmp->igmp_group_list));
 
-       list_free(igmp->igmp_group_list);
+       list_delete(igmp->igmp_group_list);
        hash_free(igmp->igmp_group_hash);
 
        XFREE(MTYPE_PIM_IGMP_SOCKET, igmp);
index 7bee75fae7e8a2ca279b927dfd0cffe887aed4ef..7fc77556ec65debd967b3e3b8ccc352b87f79769 100644 (file)
@@ -48,7 +48,7 @@ static void pim_instance_terminate(struct pim_instance *pim)
        }
 
        if (pim->static_routes)
-               list_free(pim->static_routes);
+               list_delete(pim->static_routes);
 
        pim_rp_free(pim);
 
index a00bed064f8cdcf1143d36208227d3415db8a9fe..8e0b4ab5e8ec0b27d328acbb53f45dfa0b7ca13f 100644 (file)
@@ -108,6 +108,7 @@ void pim_jp_agg_clear_group(struct list *group)
                        js->up = NULL;
                        XFREE(MTYPE_PIM_JP_AGG_SOURCE, js);
                }
+               list_delete(jag->sources);
                jag->sources = NULL;
                listnode_delete(group, jag);
                XFREE(MTYPE_PIM_JP_AGG_GROUP, jag);
index 39db34fc43c245d8cf42f4ce7fb563faf4d91f24..4b049d90ad4bd07cc5b8daf7230371736d817edb 100644 (file)
@@ -1261,7 +1261,7 @@ static void pim_msdp_mg_free(struct pim_instance *pim, struct pim_msdp_mg *mg)
                XFREE(MTYPE_PIM_MSDP_MG_NAME, mg->mesh_group_name);
 
        if (mg->mbr_list)
-               list_free(mg->mbr_list);
+               list_delete(mg->mbr_list);
 
        XFREE(MTYPE_PIM_MSDP_MG, mg);
        pim->msdp.mg = NULL;
index b3bd94dc2a3921152e2a5ae93062425888b1d0cb..9ab0709d3e77d396a375a69ea6676a9fc6491b71 100644 (file)
@@ -123,7 +123,7 @@ void pim_oil_init(struct pim_instance *pim)
 void pim_oil_terminate(struct pim_instance *pim)
 {
        if (pim->channel_oil_list)
-               list_free(pim->channel_oil_list);
+               list_delete(pim->channel_oil_list);
        pim->channel_oil_list = NULL;
 
        if (pim->channel_oil_hash)
index f83a585a8d430810a35b7df86e6560c6cd487e98..9e90a34687098c34a2befc78b5ffb97d75552e68 100644 (file)
@@ -51,7 +51,7 @@ void pim_ssmpingd_init(struct pim_instance *pim)
 void pim_ssmpingd_destroy(struct pim_instance *pim)
 {
        if (pim->ssmpingd_list) {
-               list_free(pim->ssmpingd_list);
+               list_delete(pim->ssmpingd_list);
                pim->ssmpingd_list = 0;
        }
 }