From 58ce1fa1824649124a496e4d7c3b095fe417de05 Mon Sep 17 00:00:00 2001 From: Shi Weihua Date: Tue, 19 Feb 2008 10:26:19 +0800 Subject: [PATCH] --- yaml --- r: 86885 b: refs/heads/master c: 86dffa4cd1a1d61fed68ab64c674d4094f2bdfe4 h: refs/heads/master i: 86883: c58ae79bf32b34c3ab12166c0c2dd8193f923e29 v: v3 --- [refs] | 2 +- trunk/arch/ia64/ia32/ia32_signal.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 8187e1bf033f..8e0910d9a996 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d7a6c68a2f991b18e61ebfe0251ab42c054d9a1d +refs/heads/master: 86dffa4cd1a1d61fed68ab64c674d4094f2bdfe4 diff --git a/trunk/arch/ia64/ia32/ia32_signal.c b/trunk/arch/ia64/ia32/ia32_signal.c index 85e82f32e480..256a7faeda07 100644 --- a/trunk/arch/ia64/ia32/ia32_signal.c +++ b/trunk/arch/ia64/ia32/ia32_signal.c @@ -766,8 +766,19 @@ get_sigframe (struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size) /* This is the X/Open sanctioned signal stack switching. */ if (ka->sa.sa_flags & SA_ONSTACK) { - if (!on_sig_stack(esp)) + int onstack = sas_ss_flags(esp); + + if (onstack == 0) esp = current->sas_ss_sp + current->sas_ss_size; + else if (onstack == SS_ONSTACK) { + /* + * If we are on the alternate signal stack and would + * overflow it, don't. Return an always-bogus address + * instead so we will die with SIGSEGV. + */ + if (!likely(on_sig_stack(esp - frame_size))) + return (void __user *) -1L; + } } /* Legacy stack switching not supported */