From ced44c1093ab5272b8bc367ba234b32bea561899 Mon Sep 17 00:00:00 2001 From: github login name Date: Mon, 19 Jul 2021 04:30:58 -0700 Subject: [PATCH] pimd : memory leak in rp_table cleanup. 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 (cherry picked from commit 906640dbafee986a5ac49d1089e49ac97770096f) --- pimd/pim_rp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index a31fec036f..d706fd8693 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -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); } /* -- 2.39.5