vlib: prevent some signals from being executed on workers 12/40912/3
authorGuillaume Solignac <gsoligna@cisco.com>
Wed, 22 May 2024 08:47:33 +0000 (10:47 +0200)
committerDamjan Marion <dmarion@0xa5.net>
Wed, 22 May 2024 12:52:31 +0000 (12:52 +0000)
Before this commit, SIGINT, SIGHUP and SIGTERM could be executed on the
workers. Since those signals don't stop execution, it meant that atexit
handlers (like the `vl_unmap_shmem`) could run while the main thread was
still running, which can cause race conditions. To avoid that, we
prevent workers from handling those signals.

Type: fix
Signed-off-by: Guillaume Solignac <gsoligna@cisco.com>
Change-Id: I27a87d96a027d7423ced881a614427af4ab0f969

src/vlib/threads.c

index 87b71ad..854d694 100644 (file)
@@ -370,6 +370,8 @@ void
 vlib_worker_thread_init (vlib_worker_thread_t * w)
 {
   vlib_thread_main_t *tm = vlib_get_thread_main ();
+  sigset_t signals;
+  int rv;
 
   /*
    * Note: disabling signals in worker threads as follows
@@ -379,7 +381,17 @@ vlib_worker_thread_init (vlib_worker_thread_t * w)
    *    sigfillset (&s);
    *    pthread_sigmask (SIG_SETMASK, &s, 0);
    *  }
+   * We can still disable signals for SIGINT,SIGHUP and SIGTERM as they don't
+   * trigger post-dump handlers anyway.
    */
+  sigemptyset (&signals);
+  sigaddset (&signals, SIGINT);
+  sigaddset (&signals, SIGHUP);
+  sigaddset (&signals, SIGTERM);
+  rv = pthread_sigmask (SIG_BLOCK, &signals, NULL);
+
+  if (rv)
+    clib_warning ("Failed to set the worker signal mask");
 
   clib_mem_set_heap (w->thread_mheap);