diff --git a/ChangeLog b/ChangeLog index 00c46a1038..dd08e60249 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-06-26 Andreas Schwab + + * sysdeps/powerpc/powerpc32/____longjmp_chk.S (CHECK_SP): Save lr + before call. + * sysdeps/powerpc/powerpc64/____longjmp_chk.S (CHECK_SP): + Likewise. + 2009-06-26 Ulrich Drepper * resolv/resolv.h: Define RES_SNGLKUPREOP. diff --git a/sysdeps/powerpc/powerpc32/____longjmp_chk.S b/sysdeps/powerpc/powerpc32/____longjmp_chk.S index 510ce5250d..128899a532 100644 --- a/sysdeps/powerpc/powerpc32/____longjmp_chk.S +++ b/sysdeps/powerpc/powerpc32/____longjmp_chk.S @@ -49,8 +49,16 @@ #define CHECK_SP(reg) \ cmplw reg, r1; \ bge+ .Lok; \ + cfi_remember_state; \ + mflr r0; \ + stwu r1,-16(r1); \ + cfi_adjust_cfa_offset (16); \ + stw r0,20(r1); \ + cfi_offset (lr, 4); \ LOAD_ARG; \ bl HIDDEN_JUMPTARGET (__fortify_fail); \ + nop; \ + cfi_restore_state; \ .Lok: #include <__longjmp-common.S> diff --git a/sysdeps/powerpc/powerpc64/____longjmp_chk.S b/sysdeps/powerpc/powerpc64/____longjmp_chk.S index 56549021aa..f1b7d85e46 100644 --- a/sysdeps/powerpc/powerpc64/____longjmp_chk.S +++ b/sysdeps/powerpc/powerpc64/____longjmp_chk.S @@ -32,8 +32,16 @@ #define CHECK_SP(reg) \ cmpld reg, r1; \ bge+ .Lok; \ + cfi_remember_state; \ + mflr r0; \ + std r0,16(r1); \ + stdu r1,-112(r1); \ + cfi_adjust_cfa_offset (112); \ + cfi_offset (lr, 16); \ ld r3,.LC1@toc(2); \ bl HIDDEN_JUMPTARGET (__fortify_fail); \ + nop; \ + cfi_restore_state; \ .Lok: #include <__longjmp-common.S>