]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: fix bgp_pbr_rule memory leak
authorLouis Scalbert <louis.scalbert@6wind.com>
Fri, 11 Apr 2025 15:30:15 +0000 (17:30 +0200)
committerLouis Scalbert <louis.scalbert@6wind.com>
Mon, 14 Apr 2025 11:09:36 +0000 (13:09 +0200)
Fix bgp_pbr_rule memory leak. Found by code review.

Fixes: 27e376d4e1 ("bgpd: an hash list of pbr iprule is created")
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
bgpd/bgp_pbr.c

index 76d414a92638d6142d6fadcfe8b63946b5b0e374..07de1e426e56f02e2055d9854bd7f404dc5af3fb 100644 (file)
@@ -1029,7 +1029,12 @@ static void *bgp_pbr_match_alloc_intern(void *arg)
        return new;
 }
 
-static void bgp_pbr_rule_free(void *arg)
+static void bgp_pbr_rule_free(struct bgp_pbr_rule *pbr)
+{
+       XFREE(MTYPE_PBR_RULE, pbr);
+}
+
+static void bgp_pbr_rule_hash_free(void *arg)
 {
        struct bgp_pbr_rule *bpr;
 
@@ -1042,7 +1047,7 @@ static void bgp_pbr_rule_free(void *arg)
                bpr->action->refcnt--;
                bpr->action = NULL;
        }
-       XFREE(MTYPE_PBR_RULE, bpr);
+       bgp_pbr_rule_free(bpr);
 }
 
 static void *bgp_pbr_rule_alloc_intern(void *arg)
@@ -1383,7 +1388,7 @@ struct bgp_pbr_match *bgp_pbr_match_iptable_lookup(vrf_id_t vrf_id,
 void bgp_pbr_cleanup(struct bgp *bgp)
 {
        hash_clean_and_free(&bgp->pbr_match_hash, bgp_pbr_match_hash_free);
-       hash_clean_and_free(&bgp->pbr_rule_hash, bgp_pbr_rule_free);
+       hash_clean_and_free(&bgp->pbr_rule_hash, bgp_pbr_rule_hash_free);
        hash_clean_and_free(&bgp->pbr_action_hash, bgp_pbr_action_free);
 
        if (bgp->bgp_pbr_cfg == NULL)
@@ -1666,6 +1671,8 @@ static void bgp_pbr_flush_iprule(struct bgp *bgp, struct bgp_pbr_action *bpa,
                }
        }
        hash_release(bgp->pbr_rule_hash, bpr);
+       bgp_pbr_rule_free(bpr);
+
        bgp_pbr_bpa_remove(bpa);
 }