From 97072d144ee093a653515ff6abc0b0dc243c6f7f Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Tue, 27 Jun 2023 11:44:10 +0300 Subject: [PATCH] zebra: Free Zebra client resources Memory leaks started flowing: ``` AddressSanitizer Topotests Part 0: 15 KB -> 283 KB AddressSanitizer Topotests Part 1: 1 KB -> 495 KB AddressSanitizer Topotests Part 2: 13 KB -> 478 KB AddressSanitizer Topotests Part 3: 39 KB -> 213 KB AddressSanitizer Topotests Part 4: 30 KB -> 836 KB AddressSanitizer Topotests Part 5: 0 bytes -> 356 KB AddressSanitizer Topotests Part 6: 86 KB -> 783 KB AddressSanitizer Topotests Part 7: 0 bytes -> 354 KB AddressSanitizer Topotests Part 8: 0 bytes -> 62 KB AddressSanitizer Topotests Part 9: 408 KB -> 518 KB ``` ``` Direct leak of 3584 byte(s) in 1 object(s) allocated from: #0 0x7f1957b02d28 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xded28) #1 0x559895c55df0 in qcalloc lib/memory.c:105 #2 0x559895bc1cdf in zserv_client_create zebra/zserv.c:743 #3 0x559895bc1cdf in zserv_accept zebra/zserv.c:880 #4 0x559895cf3438 in event_call lib/event.c:1995 #5 0x559895c3901c in frr_run lib/libfrr.c:1213 #6 0x559895a698f1 in main zebra/main.c:472 #7 0x7f195635ec86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21c86) ``` Fixes b20acd0 ("bgpd: Use synchronous way to get labels from Zebra") Signed-off-by: Donatas Abraitis --- zebra/zserv.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/zebra/zserv.c b/zebra/zserv.c index 85e1edeca..00a78140e 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -582,30 +582,27 @@ static void zserv_client_free(struct zserv *client) /* Close file descriptor. */ if (client->sock) { - unsigned long nroutes; - unsigned long nnhgs; + unsigned long nroutes = 0; + unsigned long nnhgs = 0; close(client->sock); - /* If this is a synchronous BGP Zebra client for label/table - * manager, then ignore it. It's not GR-aware, and causes GR to - * be skipped for the session_id == 0 (asynchronous). - */ - if (client->proto == ZEBRA_ROUTE_BGP && client->session_id == 1) - return; - if (DYNAMIC_CLIENT_GR_DISABLED(client)) { - zebra_mpls_client_cleanup_vrf_label(client->proto); + if (!client->synchronous) { + zebra_mpls_client_cleanup_vrf_label( + client->proto); - nroutes = rib_score_proto(client->proto, - client->instance); + nroutes = rib_score_proto(client->proto, + client->instance); + } zlog_notice( "client %d disconnected %lu %s routes removed from the rib", client->sock, nroutes, zebra_route_string(client->proto)); /* Not worrying about instance for now */ - nnhgs = zebra_nhg_score_proto(client->proto); + if (!client->synchronous) + nnhgs = zebra_nhg_score_proto(client->proto); zlog_notice( "client %d disconnected %lu %s nhgs removed from the rib", client->sock, nnhgs,