From: Jakub Jelinek Date: Tue, 8 Sep 2009 23:00:25 +0000 (-0700) Subject: Fix __longjmp_chk on s390/s390x. X-Git-Tag: upstream/2.30~13293 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6dfeb5245bca9f2ef94815ed9a7b979a9e0be744;p=external%2Fglibc.git Fix __longjmp_chk on s390/s390x. s390/s390x hasn't been updated to handle alternate stacks properly. --- diff --git a/ChangeLog b/ChangeLog index d6cd79d..1ae8348 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-09-08 Jakub Jelinek + + * 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 * locale/programs/ld-collate.c (struct locale_collate_t): Add diff --git a/sysdeps/s390/s390-32/____longjmp_chk.c b/sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c similarity index 73% rename from sysdeps/s390/s390-32/____longjmp_chk.c rename to sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c index c5eb721..b28e587 100644 --- a/sysdeps/s390/s390-32/____longjmp_chk.c +++ b/sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c @@ -24,6 +24,9 @@ #include #include #include +#include +#include +#include #define __longjmp ____longjmp_chk @@ -35,7 +38,18 @@ __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" diff --git a/sysdeps/s390/s390-64/____longjmp_chk.c b/sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c similarity index 73% rename from sysdeps/s390/s390-64/____longjmp_chk.c rename to sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c index 241822c..dcf58fb 100644 --- a/sysdeps/s390/s390-64/____longjmp_chk.c +++ b/sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c @@ -24,6 +24,9 @@ #include #include #include +#include +#include +#include #define __longjmp ____longjmp_chk @@ -35,7 +38,18 @@ __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"