|
From 7cc9f2c7953d48cfb70b7e0c1b0c57e45ae68ce8 Mon Sep 17 00:00:00 2001
|
|
From: Stephen Worley <sworley@cumulusnetworks.com>
|
|
Date: Wed, 1 Apr 2020 15:31:40 -0400
|
|
Subject: [PATCH] zebra: free unhashable (dup) NHEs via ID table cleanup
|
|
|
|
Free unhashable (duplicate NHEs from the kernel) via ID table
|
|
cleanup. Since the NHE ID hash table contains extra entries,
|
|
that's the one we need to be calling zebra_nhg_hash_free()
|
|
on, otherwise we will never free the unhashable NHEs.
|
|
|
|
This was found via a memleak:
|
|
|
|
==1478713== HEAP SUMMARY:
|
|
==1478713== in use at exit: 10,267 bytes in 46 blocks
|
|
==1478713== total heap usage: 76,810 allocs, 76,764 frees, 3,901,237 bytes allocated
|
|
==1478713==
|
|
==1478713== 208 (88 direct, 120 indirect) bytes in 1 blocks are definitely lost in loss record 35 of 41
|
|
==1478713== at 0x483BB1A: calloc (vg_replace_malloc.c:762)
|
|
==1478713== by 0x48E35E8: qcalloc (memory.c:110)
|
|
==1478713== by 0x451CCB: zebra_nhg_alloc (zebra_nhg.c:369)
|
|
==1478713== by 0x453DE3: zebra_nhg_copy (zebra_nhg.c:379)
|
|
==1478713== by 0x452670: nhg_ctx_process_new (zebra_nhg.c:1143)
|
|
==1478713== by 0x4523A8: nhg_ctx_process (zebra_nhg.c:1234)
|
|
==1478713== by 0x452A2D: zebra_nhg_kernel_find (zebra_nhg.c:1294)
|
|
==1478713== by 0x4326E0: netlink_nexthop_change (rt_netlink.c:2433)
|
|
==1478713== by 0x427320: netlink_parse_info (kernel_netlink.c:945)
|
|
==1478713== by 0x432DAD: netlink_nexthop_read (rt_netlink.c:2488)
|
|
==1478713== by 0x41B600: interface_list (if_netlink.c:1486)
|
|
==1478713== by 0x457275: zebra_ns_enable (zebra_ns.c:127)
|
|
|
|
Repro with:
|
|
ip next add id 1 blackhole
|
|
ip next add id 2 blackhole
|
|
|
|
valgrind /usr/lib/frr/zebra
|
|
|
|
Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
|
|
(cherry picked from commit c25c3ea57a3dcd3b36d86ba76dd34961bcb662f0)
|
|
---
|
|
zebra/zebra_router.c | 7 ++++---
|
|
1 file changed, 4 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/zebra/zebra_router.c b/zebra/zebra_router.c
|
|
index a891ffb76a..ea2b6752b3 100644
|
|
--- a/zebra/zebra_router.c
|
|
+++ b/zebra/zebra_router.c
|
|
@@ -223,10 +223,11 @@ void zebra_router_terminate(void)
|
|
zebra_vxlan_disable();
|
|
zebra_mlag_terminate();
|
|
|
|
- hash_clean(zrouter.nhgs, zebra_nhg_hash_free);
|
|
- hash_free(zrouter.nhgs);
|
|
- hash_clean(zrouter.nhgs_id, NULL);
|
|
+ /* Free NHE in ID table only since it has unhashable entries as well */
|
|
+ hash_clean(zrouter.nhgs_id, zebra_nhg_hash_free);
|
|
hash_free(zrouter.nhgs_id);
|
|
+ hash_clean(zrouter.nhgs, NULL);
|
|
+ hash_free(zrouter.nhgs);
|
|
|
|
hash_clean(zrouter.rules_hash, zebra_pbr_rules_free);
|
|
hash_free(zrouter.rules_hash);
|