]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: delete_vin_type2_route may free dest
authorDonald Sharp <sharpd@nvidia.com>
Sun, 10 Sep 2023 13:15:41 +0000 (09:15 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Mon, 11 Sep 2023 16:45:59 +0000 (12:45 -0400)
The dest pointer may be freed( but should not be
due to locking ).  Let's ensure that this assumption
is true and make coverity happy.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
bgpd/bgp_evpn.c

index 6cc1dd710d74abc098a634d3b0b57b57de53a8a0..9bc6c508dc12253510537dd81d7fa86b3f5df45f 100644 (file)
@@ -2578,7 +2578,8 @@ static void delete_global_type2_routes(struct bgp *bgp, struct bgpevpn *vpn)
        }
 }
 
-static void delete_vni_type2_route(struct bgp *bgp, struct bgp_dest *dest)
+static struct bgp_dest *delete_vni_type2_route(struct bgp *bgp,
+                                              struct bgp_dest *dest)
 {
        struct bgp_path_info *pi;
        afi_t afi = AFI_L2VPN;
@@ -2588,13 +2589,15 @@ static void delete_vni_type2_route(struct bgp *bgp, struct bgp_dest *dest)
                (const struct prefix_evpn *)bgp_dest_get_prefix(dest);
 
        if (evp->prefix.route_type != BGP_EVPN_MAC_IP_ROUTE)
-               return;
+               return dest;
 
        delete_evpn_route_entry(bgp, afi, safi, dest, &pi);
 
        /* Route entry in local table gets deleted immediately. */
        if (pi)
-               bgp_path_info_reap(dest, pi);
+               dest = bgp_path_info_reap(dest, pi);
+
+       return dest;
 }
 
 static void delete_vni_type2_routes(struct bgp *bgp, struct bgpevpn *vpn)
@@ -2605,12 +2608,16 @@ static void delete_vni_type2_routes(struct bgp *bgp, struct bgpevpn *vpn)
         * routes.
         */
        for (dest = bgp_table_top(vpn->mac_table); dest;
-            dest = bgp_route_next(dest))
-               delete_vni_type2_route(bgp, dest);
+            dest = bgp_route_next(dest)) {
+               dest = delete_vni_type2_route(bgp, dest);
+               assert(dest);
+       }
 
        for (dest = bgp_table_top(vpn->ip_table); dest;
-            dest = bgp_route_next(dest))
-               delete_vni_type2_route(bgp, dest);
+            dest = bgp_route_next(dest)) {
+               dest = delete_vni_type2_route(bgp, dest);
+               assert(dest);
+       }
 }
 
 /*