]> git.proxmox.com Git - mirror_qemu.git/commitdiff
linux-user: Recheck for pending synchronous signals too
authorPeter Maydell <peter.maydell@linaro.org>
Thu, 28 Jul 2016 15:44:45 +0000 (16:44 +0100)
committerRiku Voipio <riku.voipio@linaro.org>
Wed, 21 Sep 2016 18:51:49 +0000 (21:51 +0300)
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.

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
linux-user/signal.c

index 3337f1e5631a03730a8ab4dc35cb97b957e8376b..f2c9f8e474c62136d6775c413e626846040d5bdf 100644 (file)
@@ -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;
             }
         }