]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: Free Zebra client resources
authorDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 27 Jun 2023 08:44:10 +0000 (11:44 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 27 Jun 2023 19:48:39 +0000 (22:48 +0300)
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 <donatas@opensourcerouting.org>
zebra/zserv.c

index 85e1edeca0693fb60a18267eba61cefe4e3de582..00a78140e323508a9370f16a4a5b8ee353351c3e 100644 (file)
@@ -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,