vlib: prevent some signals from being executed on workers

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
This commit is contained in:
Guillaume Solignac
2024-05-22 10:47:33 +02:00
committed by Damjan Marion
parent 71e0902454
commit 5444973bd0

View 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);