From 24c370dd46db24ea4c610751479e908e3fb55b25 Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Tue, 14 Jan 2020 01:15:04 -0500 Subject: [PATCH] zebra: fix redist memleak on client disconnect Signed-off-by: Quentin Young --- lib/zclient.c | 12 ++++++++++++ lib/zclient.h | 1 + zebra/zserv.c | 4 +++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/zclient.c b/lib/zclient.c index 093af44389..ec1082807c 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -143,6 +143,18 @@ void redist_del_instance(struct redist_proto *red, unsigned short instance) } } +void redist_del_all_instances(struct redist_proto *red) +{ + struct listnode *ln, *nn; + unsigned short *id; + + if (!red->instances) + return; + + for (ALL_LIST_ELEMENTS(red->instances, ln, nn, id)) + redist_del_instance(red, *id); +} + /* Stop zebra client services. */ void zclient_stop(struct zclient *zclient) { diff --git a/lib/zclient.h b/lib/zclient.h index 38b6030fa3..d1aa42da6d 100644 --- a/lib/zclient.h +++ b/lib/zclient.h @@ -574,6 +574,7 @@ extern unsigned short *redist_check_instance(struct redist_proto *, unsigned short); extern void redist_add_instance(struct redist_proto *, unsigned short); extern void redist_del_instance(struct redist_proto *, unsigned short); +extern void redist_del_all_instances(struct redist_proto *red); /* * Send to zebra that the specified vrf is using label to resolve diff --git a/zebra/zserv.c b/zebra/zserv.c index 419f30e6d3..cca926f3b0 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -591,8 +591,10 @@ static void zserv_client_free(struct zserv *client) /* Free bitmaps. */ for (afi_t afi = AFI_IP; afi < AFI_MAX; afi++) { - for (int i = 0; i < ZEBRA_ROUTE_MAX; i++) + for (int i = 0; i < ZEBRA_ROUTE_MAX; i++) { vrf_bitmap_free(client->redist[afi][i]); + redist_del_all_instances(&client->mi_redist[afi][i]); + } vrf_bitmap_free(client->redist_default[afi]); } -- 2.39.5