aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/ia32/ia32_signal.c
diff options
context:
space:
mode:
authorShi Weihua <shiwh@cn.fujitsu.com>2008-02-18 21:26:19 -0500
committerTony Luck <tony.luck@intel.com>2008-03-04 17:11:22 -0500
commit86dffa4cd1a1d61fed68ab64c674d4094f2bdfe4 (patch)
treebb6450017d8327f0403037e850dbf755d9584159 /arch/ia64/ia32/ia32_signal.c
parentd7a6c68a2f991b18e61ebfe0251ab42c054d9a1d (diff)
[IA64] signal(ia64_ia32): add a signal stack overflow check
The similar check has been added to x86_32(i386) in commit id 83bd01024b1fdfc41d9b758e5669e80fca72df66. So we add this check to ia64_ia32 and improve it a liitle bit in that we need to check for stack overflow only when the signal is on stack. Signed-off-by: Shi Weihua <shiwh@cn.fujitsu.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/ia32/ia32_signal.c')
-rw-r--r--arch/ia64/ia32/ia32_signal.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/ia64/ia32/ia32_signal.c b/arch/ia64/ia32/ia32_signal.c
index 85e82f32e480..256a7faeda07 100644
--- a/arch/ia64/ia32/ia32_signal.c
+++ b/arch/ia64/ia32/ia32_signal.c
@@ -766,8 +766,19 @@ get_sigframe (struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
766 766
767 /* This is the X/Open sanctioned signal stack switching. */ 767 /* This is the X/Open sanctioned signal stack switching. */
768 if (ka->sa.sa_flags & SA_ONSTACK) { 768 if (ka->sa.sa_flags & SA_ONSTACK) {
769 if (!on_sig_stack(esp)) 769 int onstack = sas_ss_flags(esp);
770
771 if (onstack == 0)
770 esp = current->sas_ss_sp + current->sas_ss_size; 772 esp = current->sas_ss_sp + current->sas_ss_size;
773 else if (onstack == SS_ONSTACK) {
774 /*
775 * If we are on the alternate signal stack and would
776 * overflow it, don't. Return an always-bogus address
777 * instead so we will die with SIGSEGV.
778 */
779 if (!likely(on_sig_stack(esp - frame_size)))
780 return (void __user *) -1L;
781 }
771 } 782 }
772 /* Legacy stack switching not supported */ 783 /* Legacy stack switching not supported */
773 784