fib: add barrier lock for fib_urpf_list_pool and fib_entry_pool 74/33874/2
authorStanislav Zaikin <zstaseg@gmail.com>
Tue, 28 Sep 2021 16:31:32 +0000 (18:31 +0200)
committerNeale Ranns <neale@graphiant.com>
Wed, 29 Sep 2021 07:29:07 +0000 (07:29 +0000)
Pools fib_urpf_list_pool and fib_entry_pool can grow while ip6_urpf_loose_check/fib_entry_get_flags_for_source are being executed. That may result as a crash in mt environment.

Type: fix

Change-Id: I44ca2cb70255e7aaf2e1f7a7d2eecd25cbdd0aaa
Signed-off-by: Stanislav Zaikin <zstaseg@gmail.com>
src/vnet/fib/fib_entry.c
src/vnet/fib/fib_urpf_list.c

index 119a7ac..dfa0cb2 100644 (file)
@@ -599,8 +599,19 @@ fib_entry_alloc (u32 fib_index,
 {
     fib_entry_t *fib_entry;
     fib_prefix_t *fep;
+    u8 need_barrier_sync = 0;
+    vlib_main_t *vm = vlib_get_main();
+    ASSERT (vm->thread_index == 0);
+
+    pool_get_will_expand (fib_entry_pool, need_barrier_sync );
+    if (need_barrier_sync)
+        vlib_worker_thread_barrier_sync (vm);
 
     pool_get(fib_entry_pool, fib_entry);
+
+    if (need_barrier_sync)
+        vlib_worker_thread_barrier_release (vm);
+
     clib_memset(fib_entry, 0, sizeof(*fib_entry));
 
     fib_node_init(&fib_entry->fe_node,
index 4f751a6..f9790b5 100644 (file)
@@ -55,8 +55,19 @@ index_t
 fib_urpf_list_alloc_and_lock (void)
 {
     fib_urpf_list_t *urpf;
+    u8 need_barrier_sync = 0;
+    vlib_main_t *vm = vlib_get_main();
+    ASSERT (vm->thread_index == 0);
+
+    pool_get_will_expand (fib_urpf_list_pool, need_barrier_sync );
+    if (need_barrier_sync)
+        vlib_worker_thread_barrier_sync (vm);
 
     pool_get(fib_urpf_list_pool, urpf);
+
+    if (need_barrier_sync)
+        vlib_worker_thread_barrier_release (vm);
+
     clib_memset(urpf, 0, sizeof(*urpf));
 
     urpf->furpf_locks++;