]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd : memory leak in rp_table cleanup. 9297/head
authorgithub login name <ranjany@vmware.com>
Mon, 19 Jul 2021 11:30:58 +0000 (04:30 -0700)
committermergify-bot <noreply@mergify.io>
Wed, 4 Aug 2021 14:51:42 +0000 (14:51 +0000)
Problem Statement:
==================
valgrind shows memleaks in rp_table, when pimd shuts down gracefully.
2020-05-05 22:09:29,451 ERROR: Memory leaks in router [r4] for daemon [pimd]
2020-05-05 22:09:29,451 ERROR: Memory leaks in router [r4] for daemon [zebra]
2020-05-05 22:09:29,637 ERROR: Found memory leak in module pimd
2020-05-05 22:09:29,638 ERROR: ==6178== 184 (56 direct, 128 indirect) bytes in 1 blocks are definitely lost in loss record 21 of 21
2020-05-05 22:09:29,638 ERROR: ==6178== at 0x4C2FFAC: calloc (vg_replace_malloc.c:762)
2020-05-05 22:09:29,638 ERROR: ==6178== by 0x4E855EE: qcalloc (memory.c:111)
2020-05-05 22:09:29,638 ERROR: ==6178== by 0x4EAA43C: route_table_init_with_delegate (table.c:52)
2020-05-05 22:09:29,638 ERROR: ==6178== by 0x1281A1: pim_rp_init (pim_rp.c:114)
2020-05-05 22:09:29,638 ERROR: ==6178== by 0x11D0F8: pim_instance_init (pim_instance.c:117)
2020-05-05 22:09:29,638 ERROR: ==6178== by 0x11D0F8: pim_vrf_new (pim_instance.c:150)
2020-05-05 22:09:29,638 ERROR: ==6178== by 0x4EB1BEC: vrf_get (vrf.c:209)
2020-05-05 22:09:29,638 ERROR: ==6178== by 0x4EB2B2F: vrf_init (vrf.c:493)
2020-05-05 22:09:29,638 ERROR: ==6178== by 0x11D227: pim_vrf_init (pim_instance.c:217)
2020-05-05 22:09:29,638 ERROR: ==6178== by 0x11BBAB: main (pim_main.c:121)

Fix:
====
rp_info is allocated in pim_rp_init API. rp_info pointer is present
in rp_list and rp_table. In rp_list cleanup, the memory for rp_info
gets freed. rp_table clean up should be done first and then rp_list.

Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
(cherry picked from commit 906640dbafee986a5ac49d1089e49ac97770096f)

pimd/pim_rp.c

index a31fec036fc6a1ef7d36ca586c3193773cfc4b10..d706fd86933b7c8fdeb884526acb8904f4a8b700 100644 (file)
@@ -139,11 +139,12 @@ void pim_rp_init(struct pim_instance *pim)
 
 void pim_rp_free(struct pim_instance *pim)
 {
-       if (pim->rp_list)
-               list_delete(&pim->rp_list);
        if (pim->rp_table)
                route_table_finish(pim->rp_table);
        pim->rp_table = NULL;
+
+       if (pim->rp_list)
+               list_delete(&pim->rp_list);
 }
 
 /*