From: Joseph Myers Date: Wed, 5 Aug 2009 21:02:50 +0000 (+0000) Subject: Signal stack support for MIPS ____longjmp_chk. X-Git-Tag: upstream/2.30~10627^2~600 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c67273d5b28317c87d2e9ee636ead6d71635e0e5;p=external%2Fglibc.git Signal stack support for MIPS ____longjmp_chk. * sysdeps/mips/____longjmp_chk.c: Remove. Replaced by.... * sysdeps/unix/sysv/linux/mips/____longjmp_chk.c: This. New file. * sysdeps/mips/__longjmp.c (__longjmp): Use explicit register variable for env. Use expansion of CHECK_SP macro for check. * sysdeps/mips/mips64/__longjmp.c (__Longjmp): Likewise. --- diff --git a/ChangeLog.mips b/ChangeLog.mips index 9afd961..5ba4297 100644 --- a/ChangeLog.mips +++ b/ChangeLog.mips @@ -1,3 +1,11 @@ +2009-08-05 Joseph Myers + + * sysdeps/mips/____longjmp_chk.c: Remove. Replaced by.... + * sysdeps/unix/sysv/linux/mips/____longjmp_chk.c: This. New file. + * sysdeps/mips/__longjmp.c (__longjmp): Use explicit register + variable for env. Use expansion of CHECK_SP macro for check. + * sysdeps/mips/mips64/__longjmp.c (__Longjmp): Likewise. + 2009-08-03 Joseph Myers * sysdeps/unix/sysv/linux/mips/mips32/accept4.c, diff --git a/sysdeps/mips/__longjmp.c b/sysdeps/mips/__longjmp.c index 340485d..2a91771 100644 --- a/sysdeps/mips/__longjmp.c +++ b/sysdeps/mips/__longjmp.c @@ -25,19 +25,19 @@ #endif void -__longjmp (env, val_arg) - __jmp_buf env; +__longjmp (env_arg, val_arg) + __jmp_buf env_arg; int val_arg; { /* gcc 1.39.19 miscompiled the longjmp routine (as it did setjmp before the hack around it); force it to use $a1 for the longjmp value. Without this it saves $a1 in a register which gets clobbered along the way. */ + register struct __jmp_buf_internal_tag *env asm ("a0"); register int val asm ("a1"); #ifdef CHECK_SP register long sp asm ("$29"); - if ((long) (env[0].__sp) < sp) - __fortify_fail ("longjmp causes uninitialized stack frame"); + CHECK_SP (env[0].__sp, sp, long); #endif #ifdef __mips_hard_float diff --git a/sysdeps/mips/mips64/__longjmp.c b/sysdeps/mips/mips64/__longjmp.c index d7e36ff..99aac01 100644 --- a/sysdeps/mips/mips64/__longjmp.c +++ b/sysdeps/mips/mips64/__longjmp.c @@ -27,19 +27,19 @@ #endif void -__longjmp (env, val_arg) - __jmp_buf env; +__longjmp (env_arg, val_arg) + __jmp_buf env_arg; int val_arg; { /* gcc 1.39.19 miscompiled the longjmp routine (as it did setjmp before the hack around it); force it to use $a1 for the longjmp value. Without this it saves $a1 in a register which gets clobbered along the way. */ + register struct __jmp_buf_internal_tag *env asm ("a0"); register int val asm ("a1"); #ifdef CHECK_SP register long long sp asm ("$29"); - if ((long long) (env[0].__sp) < sp) - __fortify_fail ("longjmp causes uninitialized stack frame"); + CHECK_SP (env[0].__sp, sp, long long); #endif #ifdef __mips_hard_float diff --git a/sysdeps/mips/____longjmp_chk.c b/sysdeps/unix/sysv/linux/mips/____longjmp_chk.c similarity index 55% rename from sysdeps/mips/____longjmp_chk.c rename to sysdeps/unix/sysv/linux/mips/____longjmp_chk.c index a46ed15..9db339c 100644 --- a/sysdeps/mips/____longjmp_chk.c +++ b/sysdeps/unix/sysv/linux/mips/____longjmp_chk.c @@ -16,7 +16,27 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include #include #define __longjmp ____longjmp_chk -#define CHECK_SP +#define CHECK_SP(saved_sp, cur_sp, sp_type) \ + do { \ + sp_type sp_saved = (sp_type) (saved_sp); \ + if (sp_saved < (cur_sp)) \ + { \ + struct __jmp_buf_internal_tag *env_save = env_arg; \ + int val_save = val_arg; \ + stack_t ss; \ + int ret = __sigaltstack (NULL, &ss); \ + if (ret == 0 \ + && (!(ss.ss_flags & SS_ONSTACK) \ + || ((unsigned sp_type) ((sp_type) ss.ss_sp \ + + (sp_type) ss.ss_size \ + - sp_saved) \ + < ss.ss_size))) \ + __fortify_fail ("longjmp causes uninitialized stack frame"); \ + asm volatile ("move %0, %1" : "=r" (env) : "r" (env_save)); \ + asm volatile ("move %0, %1" : "=r" (val) : "r" (val_save)); \ + } \ + } while (0) #include <__longjmp.c>