]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd : multiple memory leak fixes in show commands
authorSarita Patra <saritap@vmware.com>
Tue, 12 Jan 2021 10:46:35 +0000 (02:46 -0800)
committerIgor Ryzhov <iryzhov@nfware.com>
Fri, 22 Jan 2021 15:49:43 +0000 (18:49 +0300)
Issue: bgpd got kill due to out of memory, when show bgp
neighbor json and show ip bgp neighbor <ip> routes json
commands executed multiple times in a setup having 320554
routes.

RCA: Heap allocated for bgpd keeps increasing. This is verified
using top command and show memory command.

Memleak Fix-1: show ip bgp route json command
When dumping a large bit of table data via bgp_show_route
and if there is no information to display for a particular
struct bgp_node *` the data allocated via json_object_new_array()
is not freed. This is resolved now.

Memleak Fix-2:
The function bgp_peer_counts() doesn't free the memory allocated for
json_loop when there is No such neighbor or address family. This is
fixed now.

Signed-off-by: Sarita Patra <saritap@vmware.com>
bgpd/bgp_route.c

index b60cf3068bc0061ce86e54518dfe9482f91ab3a3..8a24212dcdd0473ed02169135b090fbff392c9b7 100644 (file)
@@ -10606,8 +10606,13 @@ static int bgp_show_route_in_table(struct vty *vty, struct bgp *bgp,
                                           vty,
                                           use_json,
                                           json_paths);
-               if (use_json && display)
-                       json_object_object_add(json, "paths", json_paths);
+               if (use_json) {
+                       if (display)
+                               json_object_object_add(json, "paths",
+                                                      json_paths);
+                       else
+                               json_object_free(json_paths);
+               }
        } else {
                if ((dest = bgp_node_match(rib, &match)) != NULL) {
                        const struct prefix *dest_p = bgp_dest_get_prefix(dest);
@@ -11951,6 +11956,7 @@ static int bgp_peer_counts(struct vty *vty, struct peer *peer, afi_t afi,
                                "No such neighbor or address family");
                        vty_out(vty, "%s\n", json_object_to_json_string(json));
                        json_object_free(json);
+                       json_object_free(json_loop);
                } else
                        vty_out(vty, "%% No such neighbor or address family\n");