summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@redhat.com>2009-09-14 11:05:01 +0200
committerAndreas Schwab <schwab@redhat.com>2009-09-14 11:05:01 +0200
commita31519cef9edea573edeb58ddd85417380cc5712 (patch)
treebb7c3944c0e74a70c2da747bed34502a74c59d3a /sysdeps
parent85cf3748c6c1f8f7484a35aa17616390a621382a (diff)
parent02bf610ca82f4b5660dadcfff04124e73f8ef2ff (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"