From 03beb4f15aab948d9f1ad65d34df53d371e8dab1 Mon Sep 17 00:00:00 2001 From: Roman Bolshakov Date: Sun, 13 Jan 2019 19:50:21 -0500 Subject: [PATCH] qemu-thread: Don't block SEGV, ILL and FPE If any of these signals happen on macOS, they are not delivered to other threads and signalfd_compat receives nothing. Indeed, POSIX reference and sigprocmask(2) note that an attempt to block the signals results in undefined behaviour. SEGV and FPE can't also be received by signalfd(2) on Linux. An ability to retrieve SIGBUS via signalfd(2) is used by QEMU for memory preallocation therefore we can't unblock it without consequences. But it's important to leave a remark that the signal is lost on macOS. Backports commit 21a43af0f18335af4abb1959aa28ee9d159a2d43 from qemu --- qemu/util/qemu-thread-posix.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/qemu/util/qemu-thread-posix.c b/qemu/util/qemu-thread-posix.c index 5794247c..a38cdfeb 100644 --- a/qemu/util/qemu-thread-posix.c +++ b/qemu/util/qemu-thread-posix.c @@ -49,6 +49,11 @@ int qemu_thread_create(struct uc_struct *uc, QemuThread *thread, const char *nam /* Leave signal handling to the iothread. */ sigfillset(&set); + /* Blocking the signals can result in undefined behaviour. */ + sigdelset(&set, SIGSEGV); + sigdelset(&set, SIGFPE); + sigdelset(&set, SIGILL); + /* TODO avoid SIGBUS loss on macOS */ pthread_sigmask(SIG_SETMASK, &set, &oldset); err = pthread_create(&thread->thread, &attr, start_routine, arg); if (err) {