From f4635e33a62d6f30339a5d0cfdbfaa90fba1f8df Mon Sep 17 00:00:00 2001 From: Mark Stapp Date: Thu, 9 Jul 2020 11:21:10 -0400 Subject: [PATCH] lib: block signals in child pthreads Block signals in child/additional pthreads; frr daemons generally expect that only the main thread will handle signals. Signed-off-by: Mark Stapp --- lib/frr_pthread.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/frr_pthread.c b/lib/frr_pthread.c index e237934f81..da9594ed80 100644 --- a/lib/frr_pthread.c +++ b/lib/frr_pthread.c @@ -159,10 +159,20 @@ static void *frr_pthread_inner(void *arg) int frr_pthread_run(struct frr_pthread *fpt, const pthread_attr_t *attr) { int ret; + sigset_t oldsigs, blocksigs; + + /* Ensure we never handle signals on a background thread by blocking + * everything here (new thread inherits signal mask) + */ + sigfillset(&blocksigs); + pthread_sigmask(SIG_BLOCK, &blocksigs, &oldsigs); fpt->rcu_thread = rcu_thread_prepare(); ret = pthread_create(&fpt->thread, attr, frr_pthread_inner, fpt); + /* Restore caller's signals */ + pthread_sigmask(SIG_SETMASK, &oldsigs, NULL); + /* * Per pthread_create(3), the contents of fpt->thread are undefined if * pthread_create() did not succeed. Reset this value to zero.