Skip to content

Commit

Permalink
ARM: Don't apply pointer encryption to the frame pointer
Browse files Browse the repository at this point in the history
The frame pointer register is rarely used for that purpose on ARM and
applications that look at the contents of the jmp_buf may be relying
on reading an unencrypted value. For example, Ruby uses the contents
of jmp_buf to find the root set for garbage collection so relies on
this pointer value being unencrypted. Without this patch the Ruby
testsuite fails with a segmentation fault.

ports/ChangeLog.arm:

2013-01-14  Will Newton  <will.newton@linaro.org>

	* sysdeps/arm/__longjmp.S: Don't apply pointer encryption
	to fp register.
	* sysdeps/arm/setjmp.S: Likewise.
	* sysdeps/arm/include/bits/setjmp.h (JMP_BUF_REGLIST): Add
	fp to register list, remove a4.
	* sysdeps/unix/sysv/linux/arm/sysdep.h (PTR_MANGLE_LOAD):
	New macro.
  • Loading branch information
Will Newton committed Jan 14, 2014
1 parent 497b1e6 commit 2f10c4d
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 11 deletions.
10 changes: 10 additions & 0 deletions ports/ChangeLog.arm
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
2014-01-14 Will Newton <will.newton@linaro.org>

* sysdeps/arm/__longjmp.S: Don't apply pointer encryption
to fp register.
* sysdeps/arm/setjmp.S: Likewise.
* sysdeps/arm/include/bits/setjmp.h (JMP_BUF_REGLIST): Add
fp to register list, remove a4.
* sysdeps/unix/sysv/linux/arm/sysdep.h (PTR_MANGLE_LOAD):
New macro.

2014-01-10 Roland McGrath <roland@hack.frob.com>

* sysdeps/arm/arm-mcount.S:
Expand Down
4 changes: 1 addition & 3 deletions ports/sysdeps/arm/__longjmp.S
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,12 @@ ENTRY (__longjmp)
sfi_sp sfi_breg ip, \
ldmia \B!, JMP_BUF_REGLIST
#ifdef PTR_DEMANGLE
PTR_DEMANGLE (fp, a4, a3, a2)
ldr a4, [ip], #4
PTR_DEMANGLE2 (a4, a4, a3)
PTR_DEMANGLE (a4, a4, a3, a2)
mov sp, a4
ldr a4, [ip], #4
PTR_DEMANGLE2 (lr, a4, a3)
#else
mov fp, a4
ldr sp, [ip], #4
ldr lr, [ip], #4
#endif
Expand Down
5 changes: 2 additions & 3 deletions ports/sysdeps/arm/include/bits/setjmp.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,8 @@

#ifndef _ISOMAC
/* Register list for a ldm/stm instruction to load/store
the general registers from a __jmp_buf. The a4 register
contains fp at this point. */
# define JMP_BUF_REGLIST {a4, v1-v6, sl}
the general registers from a __jmp_buf. */
# define JMP_BUF_REGLIST {v1-v6, sl, fp}

/* Index of __jmp_buf where the sp register resides. */
# define __JMP_BUF_SP 8
Expand Down
4 changes: 1 addition & 3 deletions ports/sysdeps/arm/setjmp.S
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,7 @@

ENTRY (__sigsetjmp)
#ifdef PTR_MANGLE
PTR_MANGLE (a4, fp, a3, ip)
#else
mov a4, fp
PTR_MANGLE_LOAD (a3, ip)
#endif
mov ip, r0

Expand Down
8 changes: 6 additions & 2 deletions ports/sysdeps/unix/sysv/linux/arm/sysdep.h
Original file line number Diff line number Diff line change
Expand Up @@ -439,8 +439,10 @@ __local_syscall_error: \
#if (defined NOT_IN_libc && defined IS_IN_rtld) || \
(!defined SHARED && (!defined NOT_IN_libc || defined IS_IN_libpthread))
# ifdef __ASSEMBLER__
# define PTR_MANGLE_LOAD(guard, tmp) \
LDST_PCREL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local));
# define PTR_MANGLE(dst, src, guard, tmp) \
LDST_PCREL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \
PTR_MANGLE_LOAD(guard, tmp); \
PTR_MANGLE2(dst, src, guard)
/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
# define PTR_MANGLE2(dst, src, guard) \
Expand All @@ -457,8 +459,10 @@ extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
# endif
#else
# ifdef __ASSEMBLER__
# define PTR_MANGLE_LOAD(guard, tmp) \
LDST_GLOBAL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard));
# define PTR_MANGLE(dst, src, guard, tmp) \
LDST_GLOBAL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard)); \
PTR_MANGLE_LOAD(guard, tmp); \
PTR_MANGLE2(dst, src, guard)
/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
# define PTR_MANGLE2(dst, src, guard) \
Expand Down

0 comments on commit 2f10c4d

Please sign in to comment.