thread-mainloop: keep SIGSYS unblocked if currently trapped
authorJulien Isorce <julien.isorce@gmail.com>
Mon, 19 Oct 2015 22:29:53 +0000 (23:29 +0100)
committerArun Raghavan <git@arunraghavan.net>
Wed, 21 Oct 2015 04:15:26 +0000 (09:45 +0530)
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>
src/pulse/thread-mainloop.c

index afd0581..cbfc474 100644 (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);