Signal stack support for MIPS ____longjmp_chk.
authorJoseph Myers <joseph@codesourcery.com>
Wed, 5 Aug 2009 21:02:50 +0000 (21:02 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 5 Aug 2009 21:02:50 +0000 (21:02 +0000)
* 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.

ChangeLog.mips
sysdeps/mips/__longjmp.c
sysdeps/mips/mips64/__longjmp.c
sysdeps/unix/sysv/linux/mips/____longjmp_chk.c [moved from sysdeps/mips/____longjmp_chk.c with 55% similarity]

index 9afd961..5ba4297 100644 (file)
@@ -1,3 +1,11 @@
+2009-08-05  Joseph Myers  <joseph@codesourcery.com>
+
+       * 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  <joseph@codesourcery.com>
 
        * sysdeps/unix/sysv/linux/mips/mips32/accept4.c,
index 340485d..2a91771 100644 (file)
 #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
index d7e36ff..99aac01 100644 (file)
 #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
similarity index 55%
rename from sysdeps/mips/____longjmp_chk.c
rename to sysdeps/unix/sysv/linux/mips/____longjmp_chk.c
index a46ed15..9db339c 100644 (file)
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <signal.h>
 #include <stdio.h>
 #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>