Fix __longjmp_chk on s390/s390x.
authorJakub Jelinek <jakub@redhat.com>
Tue, 8 Sep 2009 23:00:25 +0000 (16:00 -0700)
committerUlrich Drepper <drepper@redhat.com>
Tue, 8 Sep 2009 23:00:25 +0000 (16:00 -0700)
s390/s390x hasn't been updated to handle alternate stacks properly.

ChangeLog
sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c [moved from sysdeps/s390/s390-32/____longjmp_chk.c with 73% similarity]
sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c [moved from sysdeps/s390/s390-64/____longjmp_chk.c with 73% similarity]

index d6cd79d..1ae8348 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-09-08  Jakub Jelinek  <jakub@redhat.com>
+
+       * sysdeps/s390/s390-32/____longjmp_chk.c: Removed.
+       * sysdeps/s390/s390-64/____longjmp_chk.c: Removed.
+       * sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c: New file.
+       * sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c: New file.
+
 2009-09-07  Ulrich Drepper  <drepper@redhat.com>
 
        * locale/programs/ld-collate.c (struct locale_collate_t): Add
@@ -24,6 +24,9 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
+#include <stdint.h>
+#include <signal.h>
+#include <sys/syscall.h>
 
 #define __longjmp ____longjmp_chk
 
       __asm ("lr %0, %%r15" : "=r" (cur_sp));                          \
       new_sp ^= guard;                                                 \
       if (new_sp < cur_sp)                                             \
-       __fortify_fail ("longjmp causes uninitialized stack frame");    \
+       {                                                               \
+         stack_t oss;                                                  \
+         INTERNAL_SYSCALL_DECL (err);                                  \
+         int res = INTERNAL_SYSCALL (sigaltstack, err, 2, NULL, &oss); \
+         if (!INTERNAL_SYSCALL_ERROR_P (res, err))                     \
+           {                                                           \
+             if ((oss.ss_flags & SS_ONSTACK) == 0                      \
+                 || ((uintptr_t) (oss.ss_sp + oss.ss_size) - new_sp    \
+                     >= oss.ss_size))                                  \
+               __fortify_fail ("longjmp causes uninitialized stack frame");\
+           }                                                           \
+       }                                                               \
     } while (0)
 
 #include "__longjmp.c"
@@ -24,6 +24,9 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
+#include <stdint.h>
+#include <signal.h>
+#include <sys/syscall.h>
 
 #define __longjmp ____longjmp_chk
 
       __asm ("lgr %0, %%r15" : "=r" (cur_sp));                         \
       new_sp ^= guard;                                                 \
       if (new_sp < cur_sp)                                             \
-       __fortify_fail ("longjmp causes uninitialized stack frame");    \
+       {                                                               \
+         stack_t oss;                                                  \
+         INTERNAL_SYSCALL_DECL (err);                                  \
+         int res = INTERNAL_SYSCALL (sigaltstack, err, 2, NULL, &oss); \
+         if (!INTERNAL_SYSCALL_ERROR_P (res, err))                     \
+           {                                                           \
+             if ((oss.ss_flags & SS_ONSTACK) == 0                      \
+                 || ((uintptr_t) (oss.ss_sp + oss.ss_size) - new_sp    \
+                     >= oss.ss_size))                                  \
+               __fortify_fail ("longjmp causes uninitialized stack frame");\
+           }                                                           \
+       }                                                               \
     } while (0)
 
 #include "__longjmp.c"