thread-mainloop: keep SIGSYS unblocked if currently trapped

Seccomp-BPF uses SIGSYS signal to trigger
the trap handler attached to sys_open.
If the signal is blocked then the kernel kills
the process whenever pulse audio calls 'open'.
The result backtrace is terminating in sys_open.

That's why it is required to keep SIGSYS unblocked
if it is currently unblocked and trapped.

This patch allows to have pulse audio working
in the Chromium sandbox.

Signed-off-by: Julien Isorce <j.isorce@samsung.com>
Signed-off-by: Arun Raghavan <git@arunraghavan.net>
This commit is contained in:
Julien Isorce 2015-10-19 23:29:53 +01:00 committed by Arun Raghavan
parent c25b06577c
commit 9817f396d5

View file

@ -77,10 +77,22 @@ static void thread(void *userdata) {
#ifndef OS_IS_WIN32
sigset_t mask;
sigset_t prev_mask;
struct sigaction sa;
/* Make sure that signals are delivered to the main thread */
sigfillset(&mask);
pthread_sigmask(SIG_BLOCK, &mask, NULL);
/* If SIGSYS is currently unblocked and trapped then keep it unblocked. */
if (!pthread_sigmask(SIG_SETMASK, NULL, &prev_mask) &&
!sigismember(&prev_mask, SIGSYS) &&
!sigaction(SIGSYS, NULL, &sa)
&& sa.sa_handler != SIG_DFL) {
sigdelset(&mask, SIGSYS);
}
/* Make sure that signals are delivered to the main thread.
* Use SIG_SETMASK because SIG_BLOCK does an union with current set.*/
pthread_sigmask(SIG_SETMASK, &mask, NULL);
#endif
pa_mutex_lock(m->mutex);