OSDN Git Service

score: don't mask signals if we fail to setup signal stack
authorMatt Fleming <matt.fleming@intel.com>
Fri, 11 May 2012 00:58:05 +0000 (10:58 +1000)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 22 May 2012 03:52:32 +0000 (23:52 -0400)
If setup_rt_frame() returns -EFAULT then we must not block any signals
in the current process.

Acked-by: Oleg Nesterov <oleg@redhat.com>
Cc: Chen Liqin <liqin.chen@sunplusct.com>
Cc: Lennox Wu <lennox.wu@gmail.com>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/score/kernel/signal.c

index aa57440..bf9e33e 100644 (file)
@@ -272,12 +272,14 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
         */
        ret = setup_rt_frame(ka, regs, sig, oldset, info);
 
-       spin_lock_irq(&current->sighand->siglock);
-       sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
-       if (!(ka->sa.sa_flags & SA_NODEFER))
-               sigaddset(&current->blocked, sig);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+       if (ret == 0) {
+               spin_lock_irq(&current->sighand->siglock);
+               sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
+               if (!(ka->sa.sa_flags & SA_NODEFER))
+                       sigaddset(&current->blocked, sig);
+               recalc_sigpending();
+               spin_unlock_irq(&current->sighand->siglock);
+       }
 
        return ret;
 }