bonding: fix interface deletion 70/22770/2
authorBenoît Ganne <bganne@cisco.com>
Wed, 16 Oct 2019 13:03:06 +0000 (15:03 +0200)
committerDave Barach <openvpp@barachs.net>
Thu, 17 Oct 2019 13:32:14 +0000 (13:32 +0000)
Copy sw_if_index value instead of using pointers to original
bif->slaves content which could be overriden by eg. vec_del1().

Type: feature

Change-Id: I37e458effd6b2367479574f7bd3facd4e93bada4
Signed-off-by: Benoît Ganne <bganne@cisco.com>
src/vnet/bonding/cli.c

index 6d0245d..9687e88 100644 (file)
@@ -312,8 +312,7 @@ bond_delete_if (vlib_main_t * vm, u32 sw_if_index)
   slave_if_t *sif;
   vnet_hw_interface_t *hw;
   u32 *sif_sw_if_index;
-  u32 **s_list = 0;
-  u32 i;
+  u32 *s_list = 0;
 
   hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
   if (hw == NULL || bond_dev_class.index != hw->dev_class_index)
@@ -321,21 +320,14 @@ bond_delete_if (vlib_main_t * vm, u32 sw_if_index)
 
   bif = bond_get_master_by_dev_instance (hw->dev_instance);
 
-  vec_foreach (sif_sw_if_index, bif->slaves)
+  vec_append (s_list, bif->slaves);
+  vec_foreach (sif_sw_if_index, s_list)
   {
-    vec_add1 (s_list, sif_sw_if_index);
+    sif = bond_get_slave_by_sw_if_index (*sif_sw_if_index);
+    if (sif)
+      bond_delete_neighbor (vm, bif, sif);
   }
-
-  for (i = 0; i < vec_len (s_list); i++)
-    {
-      sif_sw_if_index = s_list[i];
-      sif = bond_get_slave_by_sw_if_index (*sif_sw_if_index);
-      if (sif)
-       bond_delete_neighbor (vm, bif, sif);
-    }
-
-  if (s_list)
-    vec_free (s_list);
+  vec_free (s_list);
 
   /* bring down the interface */
   vnet_hw_interface_set_flags (vnm, bif->hw_if_index, 0);