[alpha] Fix wrong register use in ____longjmp_chk.
authorRichard Henderson <rth@twiddle.net>
Mon, 28 Mar 2011 21:44:49 +0000 (14:44 -0700)
committerRichard Henderson <rth@twiddle.net>
Mon, 28 Mar 2011 21:44:49 +0000 (14:44 -0700)
ChangeLog.alpha
sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S

index 82384ac..55f8768 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-28  Aurelien Jarno  <aurelien@aurel32.net>
+
+       * sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S(____longjmp_chk):
+       Fix wrong register in stack pointer comparison.
+
 2011-03-01  Aurelien Jarno  <aurelien@aurel32.net>
 
        * sysdeps/alpha/fpu/feupdateenv.c (feupdateenv): Add libm_hidden_def.
index 5194ed8..53eb0f2 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 1992, 1994, 1997, 2006, 2010 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1994, 1997, 2006, 2010, 2011
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -58,11 +59,17 @@ ____longjmp_chk:
        PTR_DEMANGLE2(s3, t1)
        PTR_DEMANGLE2(fp, t1)
 #endif
-       cmpule  t0, sp, t1
-       bne     t1, .Lfail
+       /* ??? While this is a proper test for detecting a longjmp to an
+          invalid frame within any given stack, the main thread stack is
+          located *below* almost everything in the address space.  Which
+          means that the test at Lfail vs the signal stack will almost
+          certainly never pass.  We ought bounds check top and bottom of
+          the current thread's stack.  */
+       cmpule  s3, sp, t1
+       bne     t1, $Lfail
 
        .align  4
-.Lok:
+$Lok:
        mov     s0, a0
        mov     s1, v0
        mov     s3, t0
@@ -103,7 +110,7 @@ ____longjmp_chk:
        ret
 
        .align  4
-.Lfail:
+$Lfail:
        cfi_restore_state
        lda     v0, __NR_sigaltstack
        lda     a0, 0
@@ -118,13 +125,13 @@ ____longjmp_chk:
        cfi_adjust_cfa_offset(-32)
 
        /* Without working sigaltstack we cannot perform the test.  */
-       bne     a3, .Lok
+       bne     a3, $Lok
 
        addq    t0, t2, t0      /* t0 = ss_sp + ss_size */
        subq    t0, s3, t0      /* t0 = (ss_sp + ss_size) - new_sp */
        cmpule  t2, t0, t0      /* t0 = (t0 >= ss_size) */
        and     t0, t1, t0      /* t0 = (t0 >= ss_size) & (ss_flags & SS_ONSTACK) */
-       bne     t0, .Lok
+       bne     t0, $Lok
 
        ldah    a0, longjmp_msg(gp)     !gprelhigh
        lda     a0, longjmp_msg(a0)     !gprellow