um: wrong sigmask saved in case of multiple sigframes
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 27 Apr 2012 03:25:06 +0000 (23:25 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 21 May 2012 18:20:27 +0000 (14:20 -0400)
we can't just find oldmask once; if there are multiple signals
and we loop building sigframes for those, ->saved_mask will be
definitely wrong for all but the first one.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/um/kernel/signal.c

index 0dfcef9..187118f 100644 (file)
@@ -74,15 +74,14 @@ static int kern_do_signal(struct pt_regs *regs)
 {
        struct k_sigaction ka_copy;
        siginfo_t info;
-       sigset_t *oldset;
        int sig, handled_sig = 0;
 
-       if (test_thread_flag(TIF_RESTORE_SIGMASK))
-               oldset = &current->saved_sigmask;
-       else
-               oldset = &current->blocked;
-
        while ((sig = get_signal_to_deliver(&info, &ka_copy, regs, NULL)) > 0) {
+               sigset_t *oldset;
+               if (test_thread_flag(TIF_RESTORE_SIGMASK))
+                       oldset = &current->saved_sigmask;
+               else
+                       oldset = &current->blocked;
                handled_sig = 1;
                /* Whee!  Actually deliver the signal.  */
                if (!handle_signal(regs, sig, &ka_copy, &info, oldset)) {