diff options
author | Andreas Schwab <schwab@redhat.com> | 2009-09-14 11:05:01 +0200 |
---|---|---|
committer | Andreas Schwab <schwab@redhat.com> | 2009-09-14 11:05:01 +0200 |
commit | a31519cef9edea573edeb58ddd85417380cc5712 (patch) | |
tree | bb7c3944c0e74a70c2da747bed34502a74c59d3a /sysdeps | |
parent | 85cf3748c6c1f8f7484a35aa17616390a621382a (diff) | |
parent | 02bf610ca82f4b5660dadcfff04124e73f8ef2ff (diff) |
Merge remote branch 'origin/master' into fedora/master
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c (renamed from sysdeps/s390/s390-32/____longjmp_chk.c) | 16 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c (renamed from sysdeps/s390/s390-64/____longjmp_chk.c) | 16 |
2 files changed, 30 insertions, 2 deletions
diff --git a/sysdeps/s390/s390-32/____longjmp_chk.c b/sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c index c5eb721e0e..b28e587498 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 <stdlib.h> #include <unistd.h> #include <stdio.h> +#include <stdint.h> +#include <signal.h> +#include <sys/syscall.h> #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 index 241822ce4a..dcf58fb50b 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 <stdlib.h> #include <unistd.h> #include <stdio.h> +#include <stdint.h> +#include <signal.h> +#include <sys/syscall.h> #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" |