aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2012-03-21 19:33:45 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-21 20:54:55 -0400
commit3785006ac3c8941feb63097c416de92114a6bc39 (patch)
tree07786cb16957a846eae8716bb311d5c4b9cb7736 /arch
parentff6d21e7aafe3cf4b20697f67e656caa4daef40b (diff)
xtensa: don't mask signals if we fail to setup signal stack
setup_frame() needs to return an indication of whether it succeeded or failed in setting up the signal stack frame. If setup_frame() fails then we must not modify current->blocked. Acked-by: Oleg Nesterov <oleg@redhat.com> Cc: Chris Zankel <chris@zankel.net> Signed-off-by: Matt Fleming <matt.fleming@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/xtensa/kernel/signal.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c
index 24655e31d8fb..17ceab8e6479 100644
--- a/arch/xtensa/kernel/signal.c
+++ b/arch/xtensa/kernel/signal.c
@@ -336,8 +336,8 @@ gen_return_code(unsigned char *codemem)
336} 336}
337 337
338 338
339static void setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info, 339static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
340 sigset_t *set, struct pt_regs *regs) 340 sigset_t *set, struct pt_regs *regs)
341{ 341{
342 struct rt_sigframe *frame; 342 struct rt_sigframe *frame;
343 int err = 0; 343 int err = 0;
@@ -422,10 +422,11 @@ static void setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
422 current->comm, current->pid, signal, frame, regs->pc); 422 current->comm, current->pid, signal, frame, regs->pc);
423#endif 423#endif
424 424
425 return; 425 return 0;
426 426
427give_sigsegv: 427give_sigsegv:
428 force_sigsegv(sig, current); 428 force_sigsegv(sig, current);
429 return -EFAULT;
429} 430}
430 431
431/* 432/*
@@ -534,7 +535,9 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
534 535
535 /* Whee! Actually deliver the signal. */ 536 /* Whee! Actually deliver the signal. */
536 /* Set up the stack frame */ 537 /* Set up the stack frame */
537 setup_frame(signr, &ka, &info, oldset, regs); 538 ret = setup_frame(signr, &ka, &info, oldset, regs);
539 if (ret)
540 return ret;
538 541
539 spin_lock_irq(&current->sighand->siglock); 542 spin_lock_irq(&current->sighand->siglock);
540 sigorsets(&current->blocked, &current->blocked, &ka.sa.sa_mask); 543 sigorsets(&current->blocked, &current->blocked, &ka.sa.sa_mask);