]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: rfapi memleak fixes
authorG. Paul Ziemba <paulz@labn.net>
Tue, 11 Apr 2023 17:57:43 +0000 (10:57 -0700)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Thu, 13 Jul 2023 10:57:22 +0000 (13:57 +0300)
Signed-off-by: G. Paul Ziemba <paulz@labn.net>
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/rfapi/rfapi.c
bgpd/rfapi/rfapi_rib.c
bgpd/rfapi/rfapi_vty.c

index 80d0b3e269d4cd663f3f1034acc2459fea4b1a4c..e9ed7224e2555eb380c4a4f54959fa3596e17922 100644 (file)
@@ -64,6 +64,8 @@
 #include <execinfo.h>
 #endif /* HAVE_GLIBC_BACKTRACE */
 
+#define DEBUG_CLEANUP 0
+
 struct ethaddr rfapi_ethaddr0 = {{0}};
 
 #define DEBUG_RFAPI_STR "RF API debugging/testing command\n"
@@ -3690,11 +3692,36 @@ void rfapi_delete(struct bgp *bgp)
 {
        extern void rfp_clear_vnc_nve_all(void); /* can't fix correctly yet */
 
+#if DEBUG_CLEANUP
+       zlog_debug("%s: bgp %p", __func__, bgp);
+#endif
+
        /*
         * This clears queries and registered routes, and closes nves
         */
        if (bgp->rfapi)
                rfp_clear_vnc_nve_all();
+
+       /*
+        * close any remaining descriptors
+        */
+       struct rfapi *h = bgp->rfapi;
+
+       if (h && h->descriptors.count) {
+               struct listnode *node, *nnode;
+               struct rfapi_descriptor *rfd;
+#if DEBUG_CLEANUP
+               zlog_debug("%s: descriptor count %u", __func__,
+                          h->descriptors.count);
+#endif
+               for (ALL_LIST_ELEMENTS(&h->descriptors, node, nnode, rfd)) {
+#if DEBUG_CLEANUP
+                       zlog_debug("%s: closing rfd %p", __func__, rfd);
+#endif
+                       (void)rfapi_close(rfd);
+               }
+       }
+
        bgp_rfapi_cfg_destroy(bgp, bgp->rfapi_cfg);
        bgp->rfapi_cfg = NULL;
        bgp_rfapi_destroy(bgp, bgp->rfapi);
index 50a10c3b1d9e3f2fc3b60c271a0d9403c3216c56..a9c0c026ed988c4efec943b22a6ab6a981205d3a 100644 (file)
@@ -53,6 +53,7 @@
 #define DEBUG_PENDING_DELETE_ROUTE     0
 #define DEBUG_NHL                      0
 #define DEBUG_RIB_SL_RD                 0
+#define DEBUG_CLEANUP 0
 
 /* forward decl */
 #if DEBUG_NHL
@@ -344,6 +345,11 @@ static void rfapiRibStartTimer(struct rfapi_descriptor *rfd,
                tcb = XCALLOC(MTYPE_RFAPI_RECENT_DELETE,
                              sizeof(struct rfapi_rib_tcb));
        }
+#if DEBUG_CLEANUP
+       zlog_debug("%s: rfd %p, rn %p, ri %p, tcb %p", __func__, rfd, rn, ri,
+                  tcb);
+#endif
+
        tcb->rfd = rfd;
        tcb->ri = ri;
        tcb->rn = rn;
@@ -523,6 +529,16 @@ void rfapiRibClear(struct rfapi_descriptor *rfd)
                                                            NULL,
                                                            (void **)&ri)) {
 
+                                               if (ri->timer) {
+                                                       struct rfapi_rib_tcb
+                                                               *tcb;
+
+                                                       tcb = THREAD_ARG(
+                                                               ri->timer);
+                                                       THREAD_OFF(ri->timer);
+                                                       XFREE(MTYPE_RFAPI_RECENT_DELETE,
+                                                             tcb);
+                                               }
                                                rfapi_info_free(ri);
                                                skiplist_delete_first(
                                                        (struct skiplist *)
@@ -572,6 +588,9 @@ void rfapiRibFree(struct rfapi_descriptor *rfd)
 {
        afi_t afi;
 
+#if DEBUG_CLEANUP
+       zlog_debug("%s: rfd %p", __func__, rfd);
+#endif
 
        /*
         * NB rfd is typically detached from master list, so is not included
index d04d1ee7500f3ede7e87c5057812f384be1c2b02..60605658ca04191b89e1a67a4becb4b9a4867a5b 100644 (file)
@@ -4914,6 +4914,7 @@ static int vnc_clear_vrf(struct vty *vty, struct bgp *bgp, const char *arg_vrf,
        clear_vnc_prefix(&cda);
        vty_out(vty, "Cleared %u out of %d prefixes.\n", cda.pfx_count,
                start_count);
+       print_cleared_stats(&cda); /* frees lists in cda */
        return CMD_SUCCESS;
 }