api: fix memory error in multi-thread environment 89/33089/5
authorXiaoming Jiang <jiangxiaoming@outlook.com>
Tue, 13 Jul 2021 03:55:59 +0000 (03:55 +0000)
committerFlorin Coras <florin.coras@gmail.com>
Wed, 14 Jul 2021 14:33:56 +0000 (14:33 +0000)
When reading vm->pending_rpc_requests in main thread,
the content may be changed by other workers.

Type: fix

Signed-off-by: Xiaoming Jiang <jiangxiaoming@outlook.com>
Change-Id: I27e9d357b5ecec0f97cd8b950019b35f72fc5f76

src/vlibmemory/memory_api.c

index f229ecf..4287bd3 100644 (file)
@@ -65,6 +65,7 @@ memclnt_queue_callback (vlib_main_t * vm)
 {
   int i;
   api_main_t *am = vlibapi_get_main ();
+  int have_pending_rpcs;
 
   if (PREDICT_FALSE (vec_len (vl_api_queue_cursizes) !=
                     1 + vec_len (am->vlib_private_rps)))
@@ -103,7 +104,12 @@ memclnt_queue_callback (vlib_main_t * vm)
          break;
        }
     }
-  if (vec_len (vm->pending_rpc_requests))
+
+  clib_spinlock_lock_if_init (&vm->pending_rpc_lock);
+  have_pending_rpcs = vec_len (vm->pending_rpc_requests) > 0;
+  clib_spinlock_unlock_if_init (&vm->pending_rpc_lock);
+
+  if (have_pending_rpcs)
     {
       vm->queue_signal_pending = 1;
       vm->api_queue_nonempty = 1;