diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-05-21 23:42:15 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-06-01 12:58:49 -0400 |
commit | a610d6e672d6d3723e8da257ad4a8a288a8f2f89 (patch) | |
tree | 2fac6ce7f72756771f4f87583205cc402589dcad /arch/x86 | |
parent | 5754f412a3f107cbcd93ee125bef296f2a07539b (diff) |
pull clearing RESTORE_SIGMASK into block_sigmask()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kernel/signal.c | 31 |
1 files changed, 9 insertions, 22 deletions
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index 56f3062c5111..700c49dcd84e 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c | |||
@@ -648,38 +648,27 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
648 | { | 648 | { |
649 | int usig = signr_convert(sig); | 649 | int usig = signr_convert(sig); |
650 | sigset_t *set = sigmask_to_save(); | 650 | sigset_t *set = sigmask_to_save(); |
651 | int ret; | ||
652 | 651 | ||
653 | /* Set up the stack frame */ | 652 | /* Set up the stack frame */ |
654 | if (is_ia32) { | 653 | if (is_ia32) { |
655 | if (ka->sa.sa_flags & SA_SIGINFO) | 654 | if (ka->sa.sa_flags & SA_SIGINFO) |
656 | ret = ia32_setup_rt_frame(usig, ka, info, set, regs); | 655 | return ia32_setup_rt_frame(usig, ka, info, set, regs); |
657 | else | 656 | else |
658 | ret = ia32_setup_frame(usig, ka, set, regs); | 657 | return ia32_setup_frame(usig, ka, set, regs); |
659 | #ifdef CONFIG_X86_X32_ABI | 658 | #ifdef CONFIG_X86_X32_ABI |
660 | } else if (is_x32) { | 659 | } else if (is_x32) { |
661 | ret = x32_setup_rt_frame(usig, ka, info, | 660 | return x32_setup_rt_frame(usig, ka, info, |
662 | (compat_sigset_t *)set, regs); | 661 | (compat_sigset_t *)set, regs); |
663 | #endif | 662 | #endif |
664 | } else { | 663 | } else { |
665 | ret = __setup_rt_frame(sig, ka, info, set, regs); | 664 | return __setup_rt_frame(sig, ka, info, set, regs); |
666 | } | 665 | } |
667 | |||
668 | if (ret) { | ||
669 | force_sigsegv(sig, current); | ||
670 | return -EFAULT; | ||
671 | } | ||
672 | |||
673 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | ||
674 | return ret; | ||
675 | } | 666 | } |
676 | 667 | ||
677 | static int | 668 | static void |
678 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | 669 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, |
679 | struct pt_regs *regs) | 670 | struct pt_regs *regs) |
680 | { | 671 | { |
681 | int ret; | ||
682 | |||
683 | /* Are we from a system call? */ | 672 | /* Are we from a system call? */ |
684 | if (syscall_get_nr(current, regs) >= 0) { | 673 | if (syscall_get_nr(current, regs) >= 0) { |
685 | /* If so, check system call restarting.. */ | 674 | /* If so, check system call restarting.. */ |
@@ -710,10 +699,10 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
710 | likely(test_and_clear_thread_flag(TIF_FORCED_TF))) | 699 | likely(test_and_clear_thread_flag(TIF_FORCED_TF))) |
711 | regs->flags &= ~X86_EFLAGS_TF; | 700 | regs->flags &= ~X86_EFLAGS_TF; |
712 | 701 | ||
713 | ret = setup_rt_frame(sig, ka, info, regs); | 702 | if (setup_rt_frame(sig, ka, info, regs) < 0) { |
714 | 703 | force_sigsegv(sig, current); | |
715 | if (ret) | 704 | return; |
716 | return ret; | 705 | } |
717 | 706 | ||
718 | /* | 707 | /* |
719 | * Clear the direction flag as per the ABI for function entry. | 708 | * Clear the direction flag as per the ABI for function entry. |
@@ -732,8 +721,6 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
732 | 721 | ||
733 | tracehook_signal_handler(sig, info, ka, regs, | 722 | tracehook_signal_handler(sig, info, ka, regs, |
734 | test_thread_flag(TIF_SINGLESTEP)); | 723 | test_thread_flag(TIF_SINGLESTEP)); |
735 | |||
736 | return 0; | ||
737 | } | 724 | } |
738 | 725 | ||
739 | #ifdef CONFIG_X86_32 | 726 | #ifdef CONFIG_X86_32 |