]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: Unlock dest if we return earlier for aggregate install
authorDonatas Abraitis <donatas@opensourcerouting.org>
Mon, 13 Mar 2023 20:26:09 +0000 (22:26 +0200)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Fri, 14 Jul 2023 08:30:44 +0000 (11:30 +0300)
If the bgp is in shutdown state or so, do not forget to unlock the dest node.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_route.c
bgpd/bgp_route.h
bgpd/bgp_routemap.c

index 747090dc3a51afa5b4974166b4e30a20b878bee8..18a7b6ae223aa478b277de464663bce2361c7670 100644 (file)
@@ -7248,7 +7248,7 @@ static struct bgp_aggregate *bgp_aggregate_new(void)
        return XCALLOC(MTYPE_BGP_AGGREGATE, sizeof(struct bgp_aggregate));
 }
 
-static void bgp_aggregate_free(struct bgp_aggregate *aggregate)
+void bgp_aggregate_free(struct bgp_aggregate *aggregate)
 {
        XFREE(MTYPE_ROUTE_MAP_NAME, aggregate->suppress_map_name);
        route_map_counter_decrement(aggregate->suppress_map);
@@ -7648,7 +7648,7 @@ static void bgp_aggregate_med_update(struct bgp_aggregate *aggregate,
 }
 
 /* Update an aggregate as routes are added/removed from the BGP table */
-void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi,
+bool bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi,
                         safi_t safi, struct bgp_aggregate *aggregate)
 {
        struct bgp_table *table;
@@ -7666,9 +7666,9 @@ void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi,
        /* If the bgp instance is being deleted or self peer is deleted
         * then do not create aggregate route
         */
-       if (CHECK_FLAG(bgp->flags, BGP_FLAG_DELETE_IN_PROGRESS)
-           || (bgp->peer_self == NULL))
-               return;
+       if (CHECK_FLAG(bgp->flags, BGP_FLAG_DELETE_IN_PROGRESS) ||
+           bgp->peer_self == NULL)
+               return false;
 
        /* Initialize and test routes for MED difference. */
        if (aggregate->match_med)
@@ -7860,6 +7860,8 @@ void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi,
        bgp_aggregate_install(bgp, afi, safi, p, origin, aspath, community,
                              ecommunity, lcommunity, atomic_aggregate,
                              aggregate);
+
+       return true;
 }
 
 void bgp_aggregate_delete(struct bgp *bgp, const struct prefix *p, afi_t afi,
@@ -8450,7 +8452,10 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi,
        bgp_dest_set_bgp_aggregate_info(dest, aggregate);
 
        /* Aggregate address insert into BGP routing table. */
-       bgp_aggregate_route(bgp, &p, afi, safi, aggregate);
+       if (!bgp_aggregate_route(bgp, &p, afi, safi, aggregate)) {
+               bgp_aggregate_free(aggregate);
+               bgp_dest_unlock_node(dest);
+       }
 
        return CMD_SUCCESS;
 }
index 2afd97c4dd18d387fb8c32e0cb6fae117a4afd96..fd6d0cfe79a45e2394e64fecbe3e5349d4f5e067 100644 (file)
@@ -780,7 +780,7 @@ extern void bgp_config_write_distance(struct vty *, struct bgp *, afi_t,
 extern void bgp_aggregate_delete(struct bgp *bgp, const struct prefix *p,
                                 afi_t afi, safi_t safi,
                                 struct bgp_aggregate *aggregate);
-extern void bgp_aggregate_route(struct bgp *bgp, const struct prefix *p,
+extern bool bgp_aggregate_route(struct bgp *bgp, const struct prefix *p,
                                afi_t afi, safi_t safi,
                                struct bgp_aggregate *aggregate);
 extern void bgp_aggregate_increment(struct bgp *bgp, const struct prefix *p,
@@ -889,6 +889,7 @@ extern void bgp_path_info_free_with_caller(const char *caller,
 extern void bgp_path_info_add_with_caller(const char *caller,
                                          struct bgp_dest *dest,
                                          struct bgp_path_info *pi);
+extern void bgp_aggregate_free(struct bgp_aggregate *aggregate);
 #define bgp_path_info_add(A, B)                                                \
        bgp_path_info_add_with_caller(__func__, (A), (B))
 #define bgp_path_info_free(B) bgp_path_info_free_with_caller(__func__, (B))
index 61cff27e9eddad8149c96b2fe55d24f77405c5a7..771e48b426fc5f47edbce03a6ecc978d60634f0c 100644 (file)
@@ -4211,8 +4211,8 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name,
                                                inet_ntop(bn_p->family,
                                                          &bn_p->u.prefix, buf,
                                                          sizeof(buf)));
-                               bgp_aggregate_route(bgp, bn_p, afi, safi,
-                                                   aggregate);
+                               (void)bgp_aggregate_route(bgp, bn_p, afi, safi,
+                                                         aggregate);
                        }
                }
        }