]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: fix segfault with '[no] bgp network import-check'
authorRenato Westphal <renato@opensourcerouting.org>
Fri, 12 May 2017 14:01:02 +0000 (11:01 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Fri, 12 May 2017 14:48:02 +0000 (11:48 -0300)
These commands were causing bgpd to crash if a static VPN route was
configured.

While here, fix a bug in bgp_static_add() and bgp_static_delete().

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
bgpd/bgp_route.c

index dbf969168e93e976da6ae88b9e022608a8333e80..ac4cb04c88cf6e2a4a27c0dad54e50c6ff0ec934 100644 (file)
@@ -4401,7 +4401,7 @@ bgp_static_add (struct bgp *bgp)
 
                for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
                  {
-                   bgp_static = rn->info;
+                   bgp_static = rm->info;
                     bgp_static_update_safi (bgp, &rm->p, bgp_static, afi, safi);
                  }
              }
@@ -4435,7 +4435,7 @@ bgp_static_delete (struct bgp *bgp)
 
                for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
                  {
-                   bgp_static = rn->info;
+                   bgp_static = rm->info;
                    bgp_static_withdraw_safi (bgp, &rm->p,
                                               AFI_IP, safi,
                                               (struct prefix_rd *)&rn->p,
@@ -4462,6 +4462,8 @@ bgp_static_redo_import_check (struct bgp *bgp)
   afi_t afi;
   safi_t safi;
   struct bgp_node *rn;
+  struct bgp_node *rm;
+  struct bgp_table *table;
   struct bgp_static *bgp_static;
 
   /* Use this flag to force reprocessing of the route */
@@ -4471,8 +4473,21 @@ bgp_static_redo_import_check (struct bgp *bgp)
       for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
        if (rn->info != NULL)
          {
-           bgp_static = rn->info;
-           bgp_static_update (bgp, &rn->p, bgp_static, afi, safi);
+           if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP) || (safi == SAFI_EVPN))
+             {
+               table = rn->info;
+
+               for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
+                 {
+                   bgp_static = rm->info;
+                   bgp_static_update_safi (bgp, &rm->p, bgp_static, afi, safi);
+                 }
+             }
+           else
+             {
+               bgp_static = rn->info;
+               bgp_static_update (bgp, &rn->p, bgp_static, afi, safi);
+             }
          }
   bgp_flag_unset(bgp, BGP_FLAG_FORCE_STATIC_PROCESS);
 }