fib: recursive calculation leads to delegate pool realloc 36/22736/1
authorNeale Ranns <nranns@cisco.com>
Mon, 14 Oct 2019 15:52:43 +0000 (08:52 -0700)
committerNeale Ranns <nranns@cisco.com>
Tue, 15 Oct 2019 11:17:36 +0000 (11:17 +0000)
Type: fix

Change-Id: Ib7ac53d1b59b641ccd3b1d733107d7f1ba174314
Signed-off-by: Neale Ranns <nranns@cisco.com>
(cherry picked from commit a66020becd7d01eefea55244cbcf5df9679a9443)

src/vnet/fib/fib_entry.c

index edbfdf6..21e8f08 100644 (file)
@@ -469,9 +469,12 @@ fib_entry_contribute_forwarding (fib_node_index_t fib_entry_index,
 
         if (NULL == fed)
         {
-            fed = fib_entry_delegate_find_or_add(
-                      fib_entry,
-                      fib_entry_chain_type_to_delegate_type(fct));
+            /*
+             * use a temporary DPO lest the delegate realloc in the recursive
+             * calculation.
+             */
+            dpo_id_t tmp = DPO_INVALID;
+
             /*
              * on-demand create eos/non-eos.
              * There is no on-demand delete because:
@@ -482,7 +485,14 @@ fib_entry_contribute_forwarding (fib_node_index_t fib_entry_index,
             fib_entry_src_mk_lb(fib_entry,
                                 fib_entry_get_best_src_i(fib_entry),
                                 fct,
-                                &fed->fd_dpo);
+                                &tmp);
+
+            fed = fib_entry_delegate_find_or_add(
+                fib_entry,
+                fib_entry_chain_type_to_delegate_type(fct));
+
+            dpo_copy(&fed->fd_dpo, &tmp);
+            dpo_reset(&tmp);
         }
 
         dpo_copy(dpo, &fed->fd_dpo);