aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-08-22 16:53:57 -0700
committerDavid S. Miller <davem@davemloft.net>2011-08-22 16:53:57 -0700
commit25ad0df13b48d9b7cf4db7190cec09d0393bd6d0 (patch)
tree86630b546bf8f3d1f8a23d9ddc3997ca6c559152
parent304c6e0b2c4d10a6cc2afdb42152aad1cf432c3a (diff)
downloadglibc-25ad0df13b48d9b7cf4db7190cec09d0393bd6d0.zip
glibc-25ad0df13b48d9b7cf4db7190cec09d0393bd6d0.tar.gz
glibc-25ad0df13b48d9b7cf4db7190cec09d0393bd6d0.tar.bz2
Bug fixes for ____longjmp_chk on sparc.
-rw-r--r--ChangeLog7
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S11
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S26
3 files changed, 39 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 60814a8..e83e46b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-08-22 David S. Miller <davem@davemloft.net>
+
+ * sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S: Fix
+ sigaltstack check, add missing cfi directives.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S: Add
+ missing cfi directives, and sigaltstack handling.
+
2011-08-16 Andreas Schwab <schwab@redhat.com>
[BZ #11724]
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S b/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
index 0ecd7dd..bbb9eaa 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
@@ -41,10 +41,14 @@ ENTRY (____longjmp_chk)
nop
save %sp, -80, %sp
+ cfi_remember_state
+ cfi_def_cfa_register(%fp)
+ cfi_window_save
+ cfi_register(%o7, %i7)
clr %o0
add %sp, 64, %o1
- set __NR_sigaltstack, %g1
+ LOADSYSCALL(sigaltstack)
ta 0x10
bcs .Lok
ld [%sp + 64 + 4], %o2
@@ -54,8 +58,8 @@ ENTRY (____longjmp_chk)
ld [%sp + 64 + 8], %o1
add %o0, %o1, %o0
- sub %o0, %g3, %o0
- cmp %o1, %o0
+ sub %o0, %g5, %o0
+ cmp %o0, %o1
bgeu .Lok
nop
@@ -76,6 +80,7 @@ ENTRY (____longjmp_chk)
.Lok:
restore
+ cfi_restore_state
.Lok_norestore:
ld ENV(o0,JB_FP), %g3 /* Cache target FP in register %g3. */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S b/sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S
index 9a4c8fe..836e62e 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S
@@ -40,8 +40,29 @@ ENTRY (____longjmp_chk)
bleu,pt %xcc, .Lok
nop
- save %sp, -128, %sp
+ save %sp, -208, %sp
+ cfi_remember_state
+ cfi_def_cfa_register(%fp)
+ cfi_window_save
+ cfi_register(%o7, %i7)
+ add %fp, 2023, %o1
+ clr %o0
+ LOADSYSCALL(sigaltstack)
+ ta 0x6d
+ bcs,pn %xcc, .Lok2
+ lduw [%fp + 2031], %l2
+ andcc %l2, 0x1, %g0
+ be,pn %xcc, .Lfail
+ ldx [%fp + 2023], %l0
+ ldx [%fp + 2039], %l1
+ sub %l0, STACK_BIAS, %l0
+ add %l0, %l1, %l0
+ sub %l0, %i2, %l0
+ cmp %l0, %l1
+ bgeu,pt %xcc, .Lok2
+ nop
+.Lfail:
#ifdef PIC
1: call 2f
sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
@@ -56,7 +77,8 @@ ENTRY (____longjmp_chk)
call HIDDEN_JUMPTARGET(__fortify_fail)
nop
- restore
+.Lok2: restore
+ cfi_restore_state
.Lok:
/* Modify the context with the value we want to return. */