From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60096) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSncR-0003Ug-Hu for qemu-devel@nongnu.org; Thu, 28 Jul 2016 11:53:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bSncP-0001oz-Ng for qemu-devel@nongnu.org; Thu, 28 Jul 2016 11:53:06 -0400 Received: from orth.archaic.org.uk ([2001:8b0:1d0::2]:58492) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSncP-0001ou-H7 for qemu-devel@nongnu.org; Thu, 28 Jul 2016 11:53:05 -0400 From: Peter Maydell Date: Thu, 28 Jul 2016 16:44:45 +0100 Message-Id: <1469720690-32060-2-git-send-email-peter.maydell@linaro.org> In-Reply-To: <1469720690-32060-1-git-send-email-peter.maydell@linaro.org> References: <1469720690-32060-1-git-send-email-peter.maydell@linaro.org> Subject: [Qemu-devel] [PATCH 1/6] linux-user: Recheck for pending synchronous signals too List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: patches@linaro.org, Riku Voipio In process_pending_signals() we restart the scan of possible pending signals after calling handle_pending_signal() in case some other signal has been generated. This rescan should also include a check for a new synchronous signal since those are in fact the only kind of new signal that the signal frame setup process might produce. Signed-off-by: Peter Maydell --- linux-user/signal.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/linux-user/signal.c b/linux-user/signal.c index 85976da..87871ce 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -5925,6 +5925,7 @@ void process_pending_signals(CPUArchState *cpu_env) sigfillset(&set); sigprocmask(SIG_SETMASK, &set, 0); + restart_scan: sig = ts->sync_signal.pending; if (sig) { /* Synchronous signals are forced, @@ -5952,8 +5953,10 @@ void process_pending_signals(CPUArchState *cpu_env) (!sigismember(blocked_set, target_to_host_signal_table[sig]))) { handle_pending_signal(cpu_env, sig, &ts->sigtab[sig - 1]); - /* Restart scan from the beginning */ - sig = 1; + /* Restart scan from the beginning, as handle_pending_signal + * might have resulted in a new synchronous signal (eg SIGSEGV). + */ + goto restart_scan; } } -- 1.9.1