diff options
author | Florian Weimer <fweimer@redhat.com> | 2022-10-18 17:00:07 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2022-10-18 17:03:55 +0200 |
commit | 88f4b6929c26f9240a4b0b7dcc62922f02544a09 (patch) | |
tree | 72acb4a359d3ec56729a910386bd1a002bd69e3c /sysdeps/unix/sysv/linux/aarch64 | |
parent | 246f37d6b1c4c6c0a6365df8783e62e3adf208e8 (diff) | |
download | glibc-88f4b6929c26f9240a4b0b7dcc62922f02544a09.tar.gz glibc-88f4b6929c26f9240a4b0b7dcc62922f02544a09.tar.xz glibc-88f4b6929c26f9240a4b0b7dcc62922f02544a09.zip |
Introduce <pointer_guard.h>, extracted from <sysdep.h>
This allows us to define a generic no-op version of PTR_MANGLE and PTR_DEMANGLE. In the future, we can use PTR_MANGLE and PTR_DEMANGLE unconditionally in C sources, avoiding an unintended loss of hardening due to missing include files or unlucky header inclusion ordering. In i386 and x86_64, we can avoid a <tls.h> dependency in the C code by using the computed constant from <tcb-offsets.h>. <sysdep.h> no longer includes these definitions, so there is no cyclic dependency anymore when computing the <tcb-offsets.h> constants. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps/unix/sysv/linux/aarch64')
-rw-r--r-- | sysdeps/unix/sysv/linux/aarch64/pointer_guard.h | 68 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/aarch64/sysdep.h | 45 |
2 files changed, 68 insertions, 45 deletions
diff --git a/sysdeps/unix/sysv/linux/aarch64/pointer_guard.h b/sysdeps/unix/sysv/linux/aarch64/pointer_guard.h new file mode 100644 index 0000000000..b81c9075f3 --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/pointer_guard.h @@ -0,0 +1,68 @@ +/* Pointer guard implementation. AArch64 version. + Copyright (C) 2014-2022 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef POINTER_GUARD_H +#define POINTER_GUARD_H + +/* Pointer mangling is supported for AArch64. */ +#if (IS_IN (rtld) \ + || (!defined SHARED && (IS_IN (libc) \ + || IS_IN (libpthread)))) +# ifdef __ASSEMBLER__ +/* Note, dst, src, guard, and tmp are all register numbers rather than + register names so they will work with both ILP32 and LP64. */ +# define PTR_MANGLE(dst, src, guard, tmp) \ + LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \ + PTR_MANGLE2 (dst, src, guard) +/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ +# define PTR_MANGLE2(dst, src, guard)\ + eor x##dst, x##src, x##guard +# define PTR_DEMANGLE(dst, src, guard, tmp)\ + PTR_MANGLE (dst, src, guard, tmp) +# define PTR_DEMANGLE2(dst, src, guard)\ + PTR_MANGLE2 (dst, src, guard) +# else +extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden; +# define PTR_MANGLE(var) \ + (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#else +# ifdef __ASSEMBLER__ +/* Note, dst, src, guard, and tmp are all register numbers rather than + register names so they will work with both ILP32 and LP64. */ +# define PTR_MANGLE(dst, src, guard, tmp) \ + LDST_GLOBAL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard)); \ + PTR_MANGLE2 (dst, src, guard) +/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ +# define PTR_MANGLE2(dst, src, guard)\ + eor x##dst, x##src, x##guard +# define PTR_DEMANGLE(dst, src, guard, tmp)\ + PTR_MANGLE (dst, src, guard, tmp) +# define PTR_DEMANGLE2(dst, src, guard)\ + PTR_MANGLE2 (dst, src, guard) +# else +# include <stdint.h> +extern uintptr_t __pointer_chk_guard attribute_relro; +# define PTR_MANGLE(var) \ + (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h index f1853e012f..8ba50dab8f 100644 --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h @@ -233,49 +233,4 @@ #endif /* __ASSEMBLER__ */ -/* Pointer mangling is supported for AArch64. */ -#if (IS_IN (rtld) \ - || (!defined SHARED && (IS_IN (libc) \ - || IS_IN (libpthread)))) -# ifdef __ASSEMBLER__ -/* Note, dst, src, guard, and tmp are all register numbers rather than - register names so they will work with both ILP32 and LP64. */ -# define PTR_MANGLE(dst, src, guard, tmp) \ - LDST_PCREL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \ - PTR_MANGLE2 (dst, src, guard) -/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ -# define PTR_MANGLE2(dst, src, guard)\ - eor x##dst, x##src, x##guard -# define PTR_DEMANGLE(dst, src, guard, tmp)\ - PTR_MANGLE (dst, src, guard, tmp) -# define PTR_DEMANGLE2(dst, src, guard)\ - PTR_MANGLE2 (dst, src, guard) -# else -extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden; -# define PTR_MANGLE(var) \ - (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#else -# ifdef __ASSEMBLER__ -/* Note, dst, src, guard, and tmp are all register numbers rather than - register names so they will work with both ILP32 and LP64. */ -# define PTR_MANGLE(dst, src, guard, tmp) \ - LDST_GLOBAL (ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard)); \ - PTR_MANGLE2 (dst, src, guard) -/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ -# define PTR_MANGLE2(dst, src, guard)\ - eor x##dst, x##src, x##guard -# define PTR_DEMANGLE(dst, src, guard, tmp)\ - PTR_MANGLE (dst, src, guard, tmp) -# define PTR_DEMANGLE2(dst, src, guard)\ - PTR_MANGLE2 (dst, src, guard) -# else -extern uintptr_t __pointer_chk_guard attribute_relro; -# define PTR_MANGLE(var) \ - (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#endif - #endif /* linux/aarch64/sysdep.h */ |