[FRR] Fix zebra memory leak when bgp fib suppress pending is enabled (#17484)

Fix zebra leaking memory with fib suppress enabled. Porting the fix from
FRRouting/frr#14983

While running test_stress_route.py, systems with lower memory started to throw low memory logs. On further investigation, a memory leak has been found in zebra which was fixed in the FRR community.
This commit is contained in:
Sudharsan Dhamal Gopalarathnam 2023-12-14 09:13:20 -08:00 committed by GitHub
parent dac2ba6e1b
commit f3f507826b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 0 deletions

View File

@ -0,0 +1,57 @@
From c13964525dae96299dc54daf635609971576a09e Mon Sep 17 00:00:00 2001
From: Donald Sharp <sharpd@nvidia.com>
Date: Mon, 11 Dec 2023 13:41:36 -0500
Subject: [PATCH] zebra: The dplane_fpm_nl return path leaks memory
The route entry created when using a ctx to pass route
entry data backup to the master pthread in zebra is
being leaked. Prevent this from happening.
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
diff --git a/zebra/rib.h b/zebra/rib.h
index 016106312..e99eee67c 100644
--- a/zebra/rib.h
+++ b/zebra/rib.h
@@ -352,6 +352,8 @@ extern void _route_entry_dump(const char *func, union prefixconstptr pp,
union prefixconstptr src_pp,
const struct route_entry *re);
+void zebra_rib_route_entry_free(struct route_entry *re);
+
struct route_entry *
zebra_rib_route_entry_new(vrf_id_t vrf_id, int type, uint8_t instance,
uint32_t flags, uint32_t nhe_id, uint32_t table_id,
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 6bdc15592..fc9e8c457 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1001,6 +1001,8 @@ int netlink_route_change_read_unicast_internal(struct nlmsghdr *h,
re, ng, startup, ctx);
if (ng)
nexthop_group_delete(&ng);
+ if (ctx)
+ zebra_rib_route_entry_free(re);
} else {
/*
* I really don't see how this is possible
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index f2f20bcf7..1cefdfae7 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -4136,6 +4136,12 @@ struct route_entry *zebra_rib_route_entry_new(vrf_id_t vrf_id, int type,
return re;
}
+
+void zebra_rib_route_entry_free(struct route_entry *re)
+{
+ XFREE(MTYPE_RE, re);
+}
+
/*
* Internal route-add implementation; there are a couple of different public
* signatures. Callers in this path are responsible for the memory they
--
2.17.1

View File

@ -32,3 +32,4 @@ cross-compile-changes.patch
0030-bgpd-Treat-EOR-as-withdrawn-to-avoid-unwanted-handli.patch 0030-bgpd-Treat-EOR-as-withdrawn-to-avoid-unwanted-handli.patch
0031-bgpd-Ignore-handling-NLRIs-if-we-received-MP_UNREACH.patch 0031-bgpd-Ignore-handling-NLRIs-if-we-received-MP_UNREACH.patch
0032-zebra-Fix-fpm-multipath-encap-addition.patch 0032-zebra-Fix-fpm-multipath-encap-addition.patch
0033-zebra-The-dplane_fpm_nl-return-path-leaks-memory.patch