FIB: recursion casues path realloc 22/19022/2
authorNeale Ranns <nranns@cisco.com>
Thu, 18 Apr 2019 09:42:20 +0000 (09:42 +0000)
committerFlorin Coras <florin.coras@gmail.com>
Fri, 19 Apr 2019 03:58:14 +0000 (03:58 +0000)
Change-Id: Ie9c2954eee90ca1a1fc1aa8280f93b2340b544c1
Signed-off-by: Neale Ranns <nranns@cisco.com>
src/vnet/fib/fib_path.c

index 55013a9..67a4bc1 100644 (file)
@@ -1883,6 +1883,9 @@ fib_path_resolve (fib_node_index_t path_index)
        fib_path_attached_next_hop_set(path);
        break;
     case FIB_PATH_TYPE_ATTACHED:
+    {
+        dpo_id_t tmp = DPO_INVALID;
+
         /*
          * path->attached.fp_interface
          */
@@ -1891,12 +1894,18 @@ fib_path_resolve (fib_node_index_t path_index)
         {
             path->fp_oper_flags &= ~FIB_PATH_OPER_FLAG_RESOLVED;
         }
-        dpo_set(&path->fp_dpo,
+        dpo_set(&tmp,
                 DPO_ADJACENCY,
                 path->fp_nh_proto,
                 fib_path_attached_get_adj(path,
                                           dpo_proto_to_link(path->fp_nh_proto)));
 
+        /*
+         * re-fetch after possible mem realloc
+         */
+        path = fib_path_get(path_index);
+        dpo_copy(&path->fp_dpo, &tmp);
+
         /*
          * become a child of the adjacency so we receive updates
          * when the interface state changes
@@ -1904,7 +1913,9 @@ fib_path_resolve (fib_node_index_t path_index)
         path->fp_sibling = adj_child_add(path->fp_dpo.dpoi_index,
                                          FIB_NODE_TYPE_PATH,
                                          fib_path_get_index(path));
+        dpo_reset(&tmp);
        break;
+    }
     case FIB_PATH_TYPE_RECURSIVE:
     {
        /*