diff options
131 files changed, 939 insertions, 531 deletions
diff --git a/hurd/sigunwind.c b/hurd/sigunwind.c index de76cf2436..28213091e3 100644 --- a/hurd/sigunwind.c +++ b/hurd/sigunwind.c @@ -22,7 +22,7 @@ #include <jmpbuf-unwind.h> #include <assert.h> #include <stdint.h> - +#include <pointer_guard.h> /* _hurd_setup_sighandler puts a link on the `active resources' chain so that _longjmp_unwind will call this function with the `struct sigcontext *' diff --git a/iconv/gconv.c b/iconv/gconv.c index 62d2b37bcd..dea9c80fee 100644 --- a/iconv/gconv.c +++ b/iconv/gconv.c @@ -23,7 +23,7 @@ #include <sys/param.h> #include <gconv_int.h> -#include <sysdep.h> +#include <pointer_guard.h> int diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c index c772856d1f..5dbf596b8d 100644 --- a/iconv/gconv_cache.c +++ b/iconv/gconv_cache.c @@ -28,6 +28,7 @@ #include <gconv_int.h> #include <iconvconfig.h> #include <not-cancel.h> +#include <pointer_guard.h> #include "../intl/hash-string.h" diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c index bf385ac7b1..90037fdf58 100644 --- a/iconv/gconv_db.c +++ b/iconv/gconv_db.c @@ -27,7 +27,7 @@ #include <dlfcn.h> #include <gconv_int.h> -#include <sysdep.h> +#include <pointer_guard.h> /* Simple data structure for alias mapping. We have two names, `from' diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c index 24c0bd1d39..c93c5dd380 100644 --- a/iconv/gconv_dl.c +++ b/iconv/gconv_dl.c @@ -26,7 +26,7 @@ #include <sys/param.h> #include <gconv_int.h> -#include <sysdep.h> +#include <pointer_guard.h> #ifdef DEBUG diff --git a/iconv/gconv_trans.c b/iconv/gconv_trans.c index 1ebbbfd51b..0f4ce10996 100644 --- a/iconv/gconv_trans.c +++ b/iconv/gconv_trans.c @@ -26,6 +26,7 @@ #include <libc-lock.h> #include "gconv_int.h" #include "../locale/localeinfo.h" +#include <pointer_guard.h> int diff --git a/iconv/skeleton.c b/iconv/skeleton.c index 0356dbf92b..42ee0b6508 100644 --- a/iconv/skeleton.c +++ b/iconv/skeleton.c @@ -147,7 +147,7 @@ # include <dlfcn.h> #endif -#include <sysdep.h> +#include <pointer_guard.h> #include <stdint.h> #ifndef DL_CALL_FCT diff --git a/inet/idna.c b/inet/idna.c index 9c76681c6a..df5811fd6a 100644 --- a/inet/idna.c +++ b/inet/idna.c @@ -21,6 +21,7 @@ #include <inet/net-internal.h> #include <netdb.h> #include <stdbool.h> +#include <pointer_guard.h> /* Use the soname and version to locate libidn2, to ensure a compatible ABI. */ diff --git a/libio/iofopncook.c b/libio/iofopncook.c index e108ad2199..a7db4ef1c9 100644 --- a/libio/iofopncook.c +++ b/libio/iofopncook.c @@ -28,6 +28,7 @@ #include <stdio.h> #include <stdlib.h> #include <shlib-compat.h> +#include <pointer_guard.h> static ssize_t _IO_cookie_read (FILE *fp, void *buf, ssize_t size) diff --git a/libio/iofwide.c b/libio/iofwide.c index 01616e06c7..1ce685f48a 100644 --- a/libio/iofwide.c +++ b/libio/iofwide.c @@ -36,7 +36,7 @@ #include <wcsmbs/wcsmbsload.h> #include <iconv/gconv_int.h> #include <shlib-compat.h> -#include <sysdep.h> +#include <pointer_guard.h> /* Return orientation of stream. If mode is nonzero try to change diff --git a/libio/libioP.h b/libio/libioP.h index ba4fdbd200..dac3de73a1 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -47,6 +47,7 @@ #include "iolibio.h" #include <shlib-compat.h> +#include <pointer_guard.h> /* For historical reasons this is the name of the sysdeps header that adjusts the libio configuration. */ diff --git a/libio/vtables.c b/libio/vtables.c index 50acab7f21..32459e4fac 100644 --- a/libio/vtables.c +++ b/libio/vtables.c @@ -20,6 +20,7 @@ #include <libioP.h> #include <stdio.h> #include <ldsodefs.h> +#include <pointer_guard.h> #ifdef SHARED diff --git a/misc/unwind-link.c b/misc/unwind-link.c index 9ae9561206..45b7886b46 100644 --- a/misc/unwind-link.c +++ b/misc/unwind-link.c @@ -23,6 +23,7 @@ #include <gnu/lib-names.h> #include <unwind-link.h> #include <libc-lock.h> +#include <pointer_guard.h> /* Statically allocate the object, so that we do not have to deal with malloc failure. __libc_unwind_link_get must not fail if libgcc_s diff --git a/nss/nss_module.c b/nss/nss_module.c index f00bbd9e1a..9a8f3ddf94 100644 --- a/nss/nss_module.c +++ b/nss/nss_module.c @@ -32,7 +32,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <sysdep.h> +#include <pointer_guard.h> /* Suffix after .so of NSS service modules. This is a bit of magic, but we assume LIBNSS_FILES_SO looks like "libnss_files.so.2" and we diff --git a/stdlib/cxa_atexit.c b/stdlib/cxa_atexit.c index 1412dacb07..adf89e93f5 100644 --- a/stdlib/cxa_atexit.c +++ b/stdlib/cxa_atexit.c @@ -21,7 +21,7 @@ #include <libc-lock.h> #include "exit.h" -#include <sysdep.h> +#include <pointer_guard.h> #undef __cxa_atexit diff --git a/stdlib/cxa_finalize.c b/stdlib/cxa_finalize.c index d4db2e1fe0..f2479569a5 100644 --- a/stdlib/cxa_finalize.c +++ b/stdlib/cxa_finalize.c @@ -19,7 +19,7 @@ #include <stdlib.h> #include "exit.h" #include <register-atfork.h> -#include <sysdep.h> +#include <pointer_guard.h> #include <stdint.h> /* If D is non-NULL, call all functions registered with `__cxa_atexit' diff --git a/stdlib/cxa_thread_atexit_impl.c b/stdlib/cxa_thread_atexit_impl.c index 5cc8eb55dd..faacab3990 100644 --- a/stdlib/cxa_thread_atexit_impl.c +++ b/stdlib/cxa_thread_atexit_impl.c @@ -75,6 +75,7 @@ #include <stdio.h> #include <stdlib.h> #include <ldsodefs.h> +#include <pointer_guard.h> typedef void (*dtor_func) (void *); diff --git a/stdlib/exit.c b/stdlib/exit.c index bc46109f3e..e59156bbf6 100644 --- a/stdlib/exit.c +++ b/stdlib/exit.c @@ -18,7 +18,7 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> -#include <sysdep.h> +#include <pointer_guard.h> #include <libc-lock.h> #include "exit.h" diff --git a/stdlib/on_exit.c b/stdlib/on_exit.c index 3e2d640d65..fb59db20ca 100644 --- a/stdlib/on_exit.c +++ b/stdlib/on_exit.c @@ -18,7 +18,7 @@ #include <assert.h> #include <stdlib.h> #include "exit.h" -#include <sysdep.h> +#include <pointer_guard.h> /* Register a function to be called by exit. */ int diff --git a/sysdeps/aarch64/__longjmp.S b/sysdeps/aarch64/__longjmp.S index 5f83f9f264..d934e00ec3 100644 --- a/sysdeps/aarch64/__longjmp.S +++ b/sysdeps/aarch64/__longjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <stap-probe.h> diff --git a/sysdeps/aarch64/jmpbuf-offsets.h b/sysdeps/aarch64/jmpbuf-offsets.h index 6256bda7a9..78bdd4a539 100644 --- a/sysdeps/aarch64/jmpbuf-offsets.h +++ b/sysdeps/aarch64/jmpbuf-offsets.h @@ -43,6 +43,7 @@ #include <setjmp.h> #include <stdint.h> #include <sysdep.h> +#include <pointer_guard.h> static inline uintptr_t __attribute__ ((unused)) _jmpbuf_sp (__jmp_buf jmpbuf) diff --git a/sysdeps/aarch64/setjmp.S b/sysdeps/aarch64/setjmp.S index 3860f4e0ec..2ed2feb488 100644 --- a/sysdeps/aarch64/setjmp.S +++ b/sysdeps/aarch64/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <stap-probe.h> diff --git a/sysdeps/alpha/__longjmp.S b/sysdeps/alpha/__longjmp.S index ec7510bb55..aed7a17ed8 100644 --- a/sysdeps/alpha/__longjmp.S +++ b/sysdeps/alpha/__longjmp.S @@ -18,6 +18,7 @@ #define __ASSEMBLY__ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> diff --git a/sysdeps/alpha/jmpbuf-unwind.h b/sysdeps/alpha/jmpbuf-unwind.h index 13b27990b3..318b73b100 100644 --- a/sysdeps/alpha/jmpbuf-unwind.h +++ b/sysdeps/alpha/jmpbuf-unwind.h @@ -20,6 +20,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/alpha/setjmp.S b/sysdeps/alpha/setjmp.S index f86367ae08..deb888c072 100644 --- a/sysdeps/alpha/setjmp.S +++ b/sysdeps/alpha/setjmp.S @@ -18,6 +18,7 @@ #define __ASSEMBLY__ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> .ent __sigsetjmp diff --git a/sysdeps/arc/jmpbuf-unwind.h b/sysdeps/arc/jmpbuf-unwind.h index 5488707919..e5434a95dd 100644 --- a/sysdeps/arc/jmpbuf-unwind.h +++ b/sysdeps/arc/jmpbuf-unwind.h @@ -20,6 +20,7 @@ #include <jmpbuf-offsets.h> #include <stdint.h> #include <unwind.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/arm/__longjmp.S b/sysdeps/arm/__longjmp.S index 5f1cf3643f..411055b9b3 100644 --- a/sysdeps/arm/__longjmp.S +++ b/sysdeps/arm/__longjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <stap-probe.h> #include <bits/setjmp.h> #include <rtld-global-offsets.h> diff --git a/sysdeps/arm/jmpbuf-unwind.h b/sysdeps/arm/jmpbuf-unwind.h index e6b118f4d0..641444eaf3 100644 --- a/sysdeps/arm/jmpbuf-unwind.h +++ b/sysdeps/arm/jmpbuf-unwind.h @@ -18,6 +18,7 @@ #include <setjmp.h> #include <stdint.h> #include <sysdep.h> +#include <pointer_guard.h> #include <unwind.h> /* Test if longjmp to JMPBUF would unwind the frame diff --git a/sysdeps/arm/pointer_guard.h b/sysdeps/arm/pointer_guard.h new file mode 100644 index 0000000000..6b90cec2f3 --- /dev/null +++ b/sysdeps/arm/pointer_guard.h @@ -0,0 +1,67 @@ +/* Pointer guard implementation. Arm version. + Copyright (C) 2013-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 support. */ +#if (IS_IN (rtld) \ + || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread)))) +# ifdef __ASSEMBLER__ +# define PTR_MANGLE_LOAD(guard, tmp) \ + LDR_HIDDEN (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local), 0) +# define PTR_MANGLE(dst, src, guard, tmp) \ + 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) \ + eor dst, src, 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__ +# define PTR_MANGLE_LOAD(guard, tmp) \ + LDR_GLOBAL (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard), 0); +# define PTR_MANGLE(dst, src, guard, tmp) \ + 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) \ + eor dst, src, 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/arm/setjmp.S b/sysdeps/arm/setjmp.S index 1c26227437..271454d769 100644 --- a/sysdeps/arm/setjmp.S +++ b/sysdeps/arm/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <stap-probe.h> #include <bits/setjmp.h> #include <rtld-global-offsets.h> diff --git a/sysdeps/arm/sysdep.h b/sysdeps/arm/sysdep.h index f19146b85f..ffd848de88 100644 --- a/sysdeps/arm/sysdep.h +++ b/sysdeps/arm/sysdep.h @@ -293,47 +293,3 @@ #else # define PC_OFS 8 #endif - -/* Pointer mangling support. */ -#if (IS_IN (rtld) \ - || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread)))) -# ifdef __ASSEMBLER__ -# define PTR_MANGLE_LOAD(guard, tmp) \ - LDR_HIDDEN (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local), 0) -# define PTR_MANGLE(dst, src, guard, tmp) \ - 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) \ - eor dst, src, 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__ -# define PTR_MANGLE_LOAD(guard, tmp) \ - LDR_GLOBAL (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard), 0); -# define PTR_MANGLE(dst, src, guard, tmp) \ - 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) \ - eor dst, src, 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 diff --git a/sysdeps/csky/abiv2/__longjmp.S b/sysdeps/csky/abiv2/__longjmp.S index 762b2cb47f..bb7da548c2 100644 --- a/sysdeps/csky/abiv2/__longjmp.S +++ b/sysdeps/csky/abiv2/__longjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> ENTRY (__longjmp) mov a2, a0 diff --git a/sysdeps/csky/abiv2/setjmp.S b/sysdeps/csky/abiv2/setjmp.S index 0acf197d02..afef3ce390 100644 --- a/sysdeps/csky/abiv2/setjmp.S +++ b/sysdeps/csky/abiv2/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> ENTRY (setjmp) movi a1, 1 diff --git a/sysdeps/csky/jmpbuf-unwind.h b/sysdeps/csky/jmpbuf-unwind.h index 358e912856..76fca431c6 100644 --- a/sysdeps/csky/jmpbuf-unwind.h +++ b/sysdeps/csky/jmpbuf-unwind.h @@ -20,6 +20,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/generic/pointer_guard.h b/sysdeps/generic/pointer_guard.h new file mode 100644 index 0000000000..58a624e1d5 --- /dev/null +++ b/sysdeps/generic/pointer_guard.h @@ -0,0 +1,29 @@ +/* Pointer obfuscation implenentation. Generic (no-op) version. + Copyright (C) 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 + +/* Assembler code depends on PTR_MANGLE not being defined for + optimization purposes. */ +#ifndef __ASSEMBLER__ +# define PTR_MANGLE(x) (void) (x) +# define PTR_DEMANGLE(x) (void) (x) +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/generic/unwind-link.h b/sysdeps/generic/unwind-link.h index 93ee80f3f8..a2076a23bf 100644 --- a/sysdeps/generic/unwind-link.h +++ b/sysdeps/generic/unwind-link.h @@ -31,7 +31,7 @@ unwind_arch_adjustment (void *prev, void *addr) #endif #ifdef SHARED -# include <sysdep.h> +# include <pointer_guard.h> # include <unwind-resume.h> # if UNWIND_LINK_FRAME_STATE_FOR diff --git a/sysdeps/i386/__longjmp.S b/sysdeps/i386/__longjmp.S index 508d370d5c..b67781ceb7 100644 --- a/sysdeps/i386/__longjmp.S +++ b/sysdeps/i386/__longjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <jmp_buf-ssp.h> #include <asm-syntax.h> diff --git a/sysdeps/i386/bsd-_setjmp.S b/sysdeps/i386/bsd-_setjmp.S index 190e35b0c7..80399dba6e 100644 --- a/sysdeps/i386/bsd-_setjmp.S +++ b/sysdeps/i386/bsd-_setjmp.S @@ -21,6 +21,7 @@ in setjmp doesn't clobber the state restored by longjmp. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <jmp_buf-ssp.h> #include <stap-probe.h> diff --git a/sysdeps/i386/bsd-setjmp.S b/sysdeps/i386/bsd-setjmp.S index 575ac96208..b367bad85f 100644 --- a/sysdeps/i386/bsd-setjmp.S +++ b/sysdeps/i386/bsd-setjmp.S @@ -21,6 +21,7 @@ in setjmp doesn't clobber the state restored by longjmp. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <jmp_buf-ssp.h> #include <stap-probe.h> diff --git a/sysdeps/i386/jmpbuf-unwind.h b/sysdeps/i386/jmpbuf-unwind.h index 416c816b45..73d214fd31 100644 --- a/sysdeps/i386/jmpbuf-unwind.h +++ b/sysdeps/i386/jmpbuf-unwind.h @@ -20,6 +20,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/i386/setjmp.S b/sysdeps/i386/setjmp.S index 217efbdf8a..b528245806 100644 --- a/sysdeps/i386/setjmp.S +++ b/sysdeps/i386/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <jmp_buf-ssp.h> #include <asm-syntax.h> diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S index d6a99fcbc8..4c40ffa158 100644 --- a/sysdeps/loongarch/__longjmp.S +++ b/sysdeps/loongarch/__longjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <sys/asm.h> ENTRY (__longjmp) diff --git a/sysdeps/loongarch/jmpbuf-unwind.h b/sysdeps/loongarch/jmpbuf-unwind.h index 6fa509151d..458edec135 100644 --- a/sysdeps/loongarch/jmpbuf-unwind.h +++ b/sysdeps/loongarch/jmpbuf-unwind.h @@ -20,6 +20,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S index 9b1cdea48c..e5f480d453 100644 --- a/sysdeps/loongarch/setjmp.S +++ b/sysdeps/loongarch/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <sys/asm.h> ENTRY (_setjmp) diff --git a/sysdeps/m68k/jmpbuf-unwind.h b/sysdeps/m68k/jmpbuf-unwind.h index 17e4b859ab..3ee46c050c 100644 --- a/sysdeps/m68k/jmpbuf-unwind.h +++ b/sysdeps/m68k/jmpbuf-unwind.h @@ -19,6 +19,7 @@ #include <setjmp.h> #include <stdint.h> #include <unwind.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/mach/hurd/i386/____longjmp_chk.S b/sysdeps/mach/hurd/i386/____longjmp_chk.S index 1a019e2e2b..81d297de0c 100644 --- a/sysdeps/mach/hurd/i386/____longjmp_chk.S +++ b/sysdeps/mach/hurd/i386/____longjmp_chk.S @@ -16,6 +16,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <tcb-offsets.h> #include <asm-syntax.h> diff --git a/sysdeps/mach/hurd/i386/__longjmp.S b/sysdeps/mach/hurd/i386/__longjmp.S index 72fcc79f4b..22915fb21e 100644 --- a/sysdeps/mach/hurd/i386/__longjmp.S +++ b/sysdeps/mach/hurd/i386/__longjmp.S @@ -16,6 +16,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <tcb-offsets.h> #include <asm-syntax.h> diff --git a/sysdeps/mach/hurd/jmp-unwind.c b/sysdeps/mach/hurd/jmp-unwind.c index f8938bc6f4..2577fbf3ee 100644 --- a/sysdeps/mach/hurd/jmp-unwind.c +++ b/sysdeps/mach/hurd/jmp-unwind.c @@ -22,7 +22,7 @@ #include <hurd/sigpreempt.h> #include <assert.h> #include <stdint.h> - +#include <pointer_guard.h> #ifndef _JMPBUF_UNWINDS #error "<jmpbuf-unwind.h> fails to define _JMPBUF_UNWINDS" diff --git a/sysdeps/microblaze/jmpbuf-unwind.h b/sysdeps/microblaze/jmpbuf-unwind.h index f23c7581a7..302e950ced 100644 --- a/sysdeps/microblaze/jmpbuf-unwind.h +++ b/sysdeps/microblaze/jmpbuf-unwind.h @@ -20,6 +20,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/mips/jmpbuf-unwind.h b/sysdeps/mips/jmpbuf-unwind.h index 813c24f3b1..28ecffedb0 100644 --- a/sysdeps/mips/jmpbuf-unwind.h +++ b/sysdeps/mips/jmpbuf-unwind.h @@ -19,6 +19,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/nios2/__longjmp.S b/sysdeps/nios2/__longjmp.S index 214901d67d..13695e25a6 100644 --- a/sysdeps/nios2/__longjmp.S +++ b/sysdeps/nios2/__longjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> /* __longjmp(jmpbuf, val) */ diff --git a/sysdeps/nios2/jmpbuf-offsets.h b/sysdeps/nios2/jmpbuf-offsets.h index a13aa76c16..76fea64ffe 100644 --- a/sysdeps/nios2/jmpbuf-offsets.h +++ b/sysdeps/nios2/jmpbuf-offsets.h @@ -32,6 +32,7 @@ #include <setjmp.h> #include <stdint.h> #include <sysdep.h> +#include <pointer_guard.h> static inline uintptr_t __attribute__ ((unused)) _jmpbuf_sp (__jmp_buf jmpbuf) diff --git a/sysdeps/nios2/setjmp.S b/sysdeps/nios2/setjmp.S index 0aa5b23d4f..ec75108b87 100644 --- a/sysdeps/nios2/setjmp.S +++ b/sysdeps/nios2/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> .text diff --git a/sysdeps/powerpc/jmpbuf-unwind.h b/sysdeps/powerpc/jmpbuf-unwind.h index 706ceda5d4..93573ce238 100644 --- a/sysdeps/powerpc/jmpbuf-unwind.h +++ b/sysdeps/powerpc/jmpbuf-unwind.h @@ -20,6 +20,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/powerpc/powerpc32/__longjmp-common.S b/sysdeps/powerpc/powerpc32/__longjmp-common.S index 13ded200e2..0e0361e4fd 100644 --- a/sysdeps/powerpc/powerpc32/__longjmp-common.S +++ b/sysdeps/powerpc/powerpc32/__longjmp-common.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <stap-probe.h> #define _ASM #ifdef __NO_VMX__ diff --git a/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S b/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S index e3937222a7..de04a62be2 100644 --- a/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S +++ b/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <stap-probe.h> #define _ASM #ifdef __NO_VMX__ diff --git a/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S b/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S index f82196e6c2..1943ffd229 100644 --- a/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S +++ b/sysdeps/powerpc/powerpc32/fpu/setjmp-common.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <stap-probe.h> #define _ASM #ifdef __NO_VMX__ diff --git a/sysdeps/powerpc/powerpc32/setjmp-common.S b/sysdeps/powerpc/powerpc32/setjmp-common.S index c632a3f8f2..281dd65f6a 100644 --- a/sysdeps/powerpc/powerpc32/setjmp-common.S +++ b/sysdeps/powerpc/powerpc32/setjmp-common.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <stap-probe.h> #define _ASM #ifdef __NO_VMX__ diff --git a/sysdeps/powerpc/powerpc64/__longjmp-common.S b/sysdeps/powerpc/powerpc64/__longjmp-common.S index 5f629e1e0f..ff3e0beb23 100644 --- a/sysdeps/powerpc/powerpc64/__longjmp-common.S +++ b/sysdeps/powerpc/powerpc64/__longjmp-common.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <stap-probe.h> #define _ASM #define _SETJMP_H diff --git a/sysdeps/powerpc/powerpc64/setjmp-common.S b/sysdeps/powerpc/powerpc64/setjmp-common.S index 19e76d59ee..75389e4d26 100644 --- a/sysdeps/powerpc/powerpc64/setjmp-common.S +++ b/sysdeps/powerpc/powerpc64/setjmp-common.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <stap-probe.h> #define _ASM #ifdef __NO_VMX__ diff --git a/sysdeps/riscv/jmpbuf-unwind.h b/sysdeps/riscv/jmpbuf-unwind.h index 28e73dda55..b411a246d1 100644 --- a/sysdeps/riscv/jmpbuf-unwind.h +++ b/sysdeps/riscv/jmpbuf-unwind.h @@ -20,6 +20,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/s390/jmpbuf-unwind.h b/sysdeps/s390/jmpbuf-unwind.h index b4ff8da6e2..10b37f09c3 100644 --- a/sysdeps/s390/jmpbuf-unwind.h +++ b/sysdeps/s390/jmpbuf-unwind.h @@ -21,6 +21,7 @@ #include <unwind.h> #include <bits/wordsize.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame diff --git a/sysdeps/s390/s390-32/__longjmp.c b/sysdeps/s390/s390-32/__longjmp.c index 09a3a2b8f8..83d42329a3 100644 --- a/sysdeps/s390/s390-32/__longjmp.c +++ b/sysdeps/s390/s390-32/__longjmp.c @@ -17,6 +17,7 @@ #include <errno.h> #include <sysdep.h> +#include <pointer_guard.h> #include <setjmp.h> #include <bits/setjmp.h> #include <stdlib.h> diff --git a/sysdeps/s390/s390-32/setjmp.S b/sysdeps/s390/s390-32/setjmp.S index c15c7bb99a..08704238f8 100644 --- a/sysdeps/s390/s390-32/setjmp.S +++ b/sysdeps/s390/s390-32/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #define _ASM #define _SETJMP_H #include <bits/setjmp.h> diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c index 2ca96e1b1b..9fe4939e5e 100644 --- a/sysdeps/s390/s390-64/__longjmp.c +++ b/sysdeps/s390/s390-64/__longjmp.c @@ -17,6 +17,7 @@ #include <errno.h> #include <sysdep.h> +#include <pointer_guard.h> #include <setjmp.h> #include <bits/setjmp.h> #include <stdlib.h> diff --git a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/s390-64/setjmp.S index 6dcd77df15..5c59f571a2 100644 --- a/sysdeps/s390/s390-64/setjmp.S +++ b/sysdeps/s390/s390-64/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #define _ASM #define _SETJMP_H #include <bits/setjmp.h> diff --git a/sysdeps/sh/jmpbuf-unwind.h b/sysdeps/sh/jmpbuf-unwind.h index c6672955ae..1957e5275d 100644 --- a/sysdeps/sh/jmpbuf-unwind.h +++ b/sysdeps/sh/jmpbuf-unwind.h @@ -19,6 +19,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/sh/sh3/__longjmp.S b/sysdeps/sh/sh3/__longjmp.S index 4228b5fef7..f10bed2afe 100644 --- a/sysdeps/sh/sh3/__longjmp.S +++ b/sysdeps/sh/sh3/__longjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #define _SETJMP_H #define _ASM #include <bits/setjmp.h> diff --git a/sysdeps/sh/sh3/setjmp.S b/sysdeps/sh/sh3/setjmp.S index 0dd0003efe..363e16fb15 100644 --- a/sysdeps/sh/sh3/setjmp.S +++ b/sysdeps/sh/sh3/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> ENTRY (__sigsetjmp) diff --git a/sysdeps/sh/sh4/__longjmp.S b/sysdeps/sh/sh4/__longjmp.S index 2013b71794..bc179e4584 100644 --- a/sysdeps/sh/sh4/__longjmp.S +++ b/sysdeps/sh/sh4/__longjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #define _SETJMP_H #define _ASM #include <bits/setjmp.h> diff --git a/sysdeps/sh/sh4/setjmp.S b/sysdeps/sh/sh4/setjmp.S index b73aa3c18c..f28ec42091 100644 --- a/sysdeps/sh/sh4/setjmp.S +++ b/sysdeps/sh/sh4/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> ENTRY (__sigsetjmp) diff --git a/sysdeps/sparc/sparc32/__longjmp.S b/sysdeps/sparc/sparc32/__longjmp.S index 5bed2440ac..68b3b15cb1 100644 --- a/sysdeps/sparc/sparc32/__longjmp.S +++ b/sysdeps/sparc/sparc32/__longjmp.S @@ -16,6 +16,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #define ENV(base,reg) [%base + (reg * 4)] diff --git a/sysdeps/sparc/sparc32/jmpbuf-unwind.h b/sysdeps/sparc/sparc32/jmpbuf-unwind.h index 3ab5088555..8b697ed95b 100644 --- a/sysdeps/sparc/sparc32/jmpbuf-unwind.h +++ b/sysdeps/sparc/sparc32/jmpbuf-unwind.h @@ -20,6 +20,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/sparc/sparc32/setjmp.S b/sysdeps/sparc/sparc32/setjmp.S index 9c7531bc95..c4e29c47b9 100644 --- a/sysdeps/sparc/sparc32/setjmp.S +++ b/sysdeps/sparc/sparc32/setjmp.S @@ -16,6 +16,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <sys/trap.h> #include <jmpbuf-offsets.h> 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 */ diff --git a/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S b/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S index 610f401d45..566a3b0211 100644 --- a/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S +++ b/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S @@ -16,6 +16,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> diff --git a/sysdeps/unix/sysv/linux/alpha/pointer_guard.h b/sysdeps/unix/sysv/linux/alpha/pointer_guard.h new file mode 100644 index 0000000000..d4d513d816 --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/pointer_guard.h @@ -0,0 +1,62 @@ +/* Pointer guard implementation. Alpha version. + Copyright (C) 2006-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 support. Note that tls access is slow enough that + we don't deoptimize things by placing the pointer check value there. */ + +#ifdef __ASSEMBLER__ +# if IS_IN (rtld) +# define PTR_MANGLE(dst, src, tmp) \ + ldah tmp, __pointer_chk_guard_local($29) !gprelhigh; \ + ldq tmp, __pointer_chk_guard_local(tmp) !gprellow; \ + xor src, tmp, dst +# define PTR_MANGLE2(dst, src, tmp) \ + xor src, tmp, dst +# elif defined SHARED +# define PTR_MANGLE(dst, src, tmp) \ + ldq tmp, __pointer_chk_guard; \ + xor src, tmp, dst +# else +# define PTR_MANGLE(dst, src, tmp) \ + ldq tmp, __pointer_chk_guard_local; \ + xor src, tmp, dst +# endif +# define PTR_MANGLE2(dst, src, tmp) \ + xor src, tmp, dst +# define PTR_DEMANGLE(dst, tmp) PTR_MANGLE(dst, dst, tmp) +# define PTR_DEMANGLE2(dst, tmp) PTR_MANGLE2(dst, dst, tmp) +#else +# include <stdint.h> +# if (IS_IN (rtld) \ + || (!defined SHARED && (IS_IN (libc) \ + || IS_IN (libpthread)))) +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) +# else +extern uintptr_t __pointer_chk_guard attribute_relro; +# define PTR_MANGLE(var) \ + (var) = (__typeof(var)) ((uintptr_t) (var) ^ __pointer_chk_guard) +# endif +# define PTR_DEMANGLE(var) PTR_MANGLE(var) +#endif /* ASSEMBLER */ + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.h b/sysdeps/unix/sysv/linux/alpha/sysdep.h index 77ec2b5400..0ddcb58b30 100644 --- a/sysdeps/unix/sysv/linux/alpha/sysdep.h +++ b/sysdeps/unix/sysv/linux/alpha/sysdep.h @@ -313,44 +313,4 @@ __LABEL(name) \ }) #endif /* ASSEMBLER */ -/* Pointer mangling support. Note that tls access is slow enough that - we don't deoptimize things by placing the pointer check value there. */ - -#ifdef __ASSEMBLER__ -# if IS_IN (rtld) -# define PTR_MANGLE(dst, src, tmp) \ - ldah tmp, __pointer_chk_guard_local($29) !gprelhigh; \ - ldq tmp, __pointer_chk_guard_local(tmp) !gprellow; \ - xor src, tmp, dst -# define PTR_MANGLE2(dst, src, tmp) \ - xor src, tmp, dst -# elif defined SHARED -# define PTR_MANGLE(dst, src, tmp) \ - ldq tmp, __pointer_chk_guard; \ - xor src, tmp, dst -# else -# define PTR_MANGLE(dst, src, tmp) \ - ldq tmp, __pointer_chk_guard_local; \ - xor src, tmp, dst -# endif -# define PTR_MANGLE2(dst, src, tmp) \ - xor src, tmp, dst -# define PTR_DEMANGLE(dst, tmp) PTR_MANGLE(dst, dst, tmp) -# define PTR_DEMANGLE2(dst, tmp) PTR_MANGLE2(dst, dst, tmp) -#else -# include <stdint.h> -# if (IS_IN (rtld) \ - || (!defined SHARED && (IS_IN (libc) \ - || IS_IN (libpthread)))) -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) -# else -extern uintptr_t __pointer_chk_guard attribute_relro; -# define PTR_MANGLE(var) \ - (var) = (__typeof(var)) ((uintptr_t) (var) ^ __pointer_chk_guard) -# endif -# define PTR_DEMANGLE(var) PTR_MANGLE(var) -#endif /* ASSEMBLER */ - #endif /* _LINUX_ALPHA_SYSDEP_H */ diff --git a/sysdeps/unix/sysv/linux/arc/sysdep.h b/sysdeps/unix/sysv/linux/arc/sysdep.h index d0c1a78381..512284a705 100644 --- a/sysdeps/unix/sysv/linux/arc/sysdep.h +++ b/sysdeps/unix/sysv/linux/arc/sysdep.h @@ -215,10 +215,6 @@ hidden_proto (__syscall_error) LOAD_ARGS_6 (nm, arg1, arg2, arg3, arg4, arg5, arg6) \ register long int _arg7 __asm__ ("r6") = _tmp7; -/* Pointer mangling not yet supported. */ -# define PTR_MANGLE(var) (void) (var) -# define PTR_DEMANGLE(var) (void) (var) - # undef HAVE_INTERNAL_BRK_ADDR_SYMBOL # define HAVE_INTERNAL_BRK_ADDR_SYMBOL 1 diff --git a/sysdeps/unix/sysv/linux/csky/pointer_guard.h b/sysdeps/unix/sysv/linux/csky/pointer_guard.h new file mode 100644 index 0000000000..ed683220c9 --- /dev/null +++ b/sysdeps/unix/sysv/linux/csky/pointer_guard.h @@ -0,0 +1,68 @@ +/* Pointer obfuscation implenentation. C-SKY version. + Copyright (C) 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 + +#if (IS_IN (rtld) \ + || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread)))) +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(dst, src, guard) \ + grs t0, 1f; \ +1: \ + lrw guard, 1b@GOTPC; \ + addu t0, guard; \ + lrw guard, __pointer_chk_guard_local@GOT; \ + ldr.w guard, (t0, guard << 0); \ + ldw guard, (guard, 0); \ + xor dst, src, guard; +# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard) +# define PTR_MANGLE2(dst, src, guard) \ + xor dst, src, guard +# define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard) +# else +extern uintptr_t __pointer_chk_guard_local; +# 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__ +# define PTR_MANGLE(dst, src, guard) \ + grs t0, 1f; \ +1: \ + lrw guard, 1b@GOTPC; \ + addu t0, guard; \ + lrw guard, __pointer_chk_guard@GOT; \ + ldr.w guard, (t0, guard << 0); \ + ldw guard, (guard, 0); \ + xor dst, src, guard; +# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard) +# define PTR_MANGLE2(dst, src, guard) \ + xor dst, src, guard +# define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard) +# else +# include <stdint.h> +extern uintptr_t __pointer_chk_guard; +# 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/csky/sysdep.h b/sysdeps/unix/sysv/linux/csky/sysdep.h index 56c527fa8b..76b09f0cc6 100644 --- a/sysdeps/unix/sysv/linux/csky/sysdep.h +++ b/sysdeps/unix/sysv/linux/csky/sysdep.h @@ -466,50 +466,4 @@ __local_syscall_error: \ #endif /* __ASSEMBLER__ */ -/* Pointer mangling support. */ -#if (IS_IN (rtld) \ - || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread)))) -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(dst, src, guard) \ - grs t0, 1f; \ -1: \ - lrw guard, 1b@GOTPC; \ - addu t0, guard; \ - lrw guard, __pointer_chk_guard_local@GOT; \ - ldr.w guard, (t0, guard << 0); \ - ldw guard, (guard, 0); \ - xor dst, src, guard; -# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard) -# define PTR_MANGLE2(dst, src, guard) \ - xor dst, src, guard -# define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard) -# else -extern uintptr_t __pointer_chk_guard_local; -# 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__ -# define PTR_MANGLE(dst, src, guard) \ - grs t0, 1f; \ -1: \ - lrw guard, 1b@GOTPC; \ - addu t0, guard; \ - lrw guard, __pointer_chk_guard@GOT; \ - ldr.w guard, (t0, guard << 0); \ - ldw guard, (guard, 0); \ - xor dst, src, guard; -# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard) -# define PTR_MANGLE2(dst, src, guard) \ - xor dst, src, guard -# define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard) -# else -extern uintptr_t __pointer_chk_guard; -# define PTR_MANGLE(var) \ - (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#endif - #endif /* linux/csky/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/hppa/sysdep.h b/sysdeps/unix/sysv/linux/hppa/sysdep.h index 2f339a4bd6..3aef8f536a 100644 --- a/sysdeps/unix/sysv/linux/hppa/sysdep.h +++ b/sysdeps/unix/sysv/linux/hppa/sysdep.h @@ -470,8 +470,4 @@ L(pre_end): ASM_LINE_SEP \ #endif /* __ASSEMBLER__ */ -/* Pointer mangling is not yet supported for HPPA. */ -#define PTR_MANGLE(var) (void) (var) -#define PTR_DEMANGLE(var) (void) (var) - #endif /* _LINUX_HPPA_SYSDEP_H */ diff --git a/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S b/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S index a1cf9a4b21..f409542a62 100644 --- a/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S +++ b/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S @@ -16,6 +16,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <jmp_buf-ssp.h> #include <asm-syntax.h> diff --git a/sysdeps/unix/sysv/linux/i386/pointer_guard.h b/sysdeps/unix/sysv/linux/i386/pointer_guard.h new file mode 100644 index 0000000000..a2d2a0c38b --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/pointer_guard.h @@ -0,0 +1,49 @@ +/* Pointer obfuscation implenentation. i386 version. + Copyright (C) 2005-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 + +#include <tcb-offsets.h> + +#if IS_IN (rtld) +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. Using a global variable + is too complicated here since we have no PC-relative addressing mode. */ +# include <sysdeps/generic/pointer_guard.h> +#else +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(reg) xorl %gs:POINTER_GUARD, reg; \ + roll $9, reg +# define PTR_DEMANGLE(reg) rorl $9, reg; \ + xorl %gs:POINTER_GUARD, reg +# else +# define PTR_MANGLE(var) asm ("xorl %%gs:%c2, %0\n" \ + "roll $9, %0" \ + : "=r" (var) \ + : "0" (var), \ + "i" (POINTER_GUARD)) +# define PTR_DEMANGLE(var) asm ("rorl $9, %0\n" \ + "xorl %%gs:%c2, %0" \ + : "=r" (var) \ + : "0" (var), \ + "i" (POINTER_GUARD)) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h index 7085f7e19a..b8be668a42 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.h +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -446,34 +446,6 @@ struct libc_do_syscall_args #endif /* __ASSEMBLER__ */ - -/* Pointer mangling support. */ -#if IS_IN (rtld) -/* We cannot use the thread descriptor because in ld.so we use setjmp - earlier than the descriptor is initialized. Using a global variable - is too complicated here since we have no PC-relative addressing mode. */ -#else -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(reg) xorl %gs:POINTER_GUARD, reg; \ - roll $9, reg -# define PTR_DEMANGLE(reg) rorl $9, reg; \ - xorl %gs:POINTER_GUARD, reg -# else -# define PTR_MANGLE(var) asm ("xorl %%gs:%c2, %0\n" \ - "roll $9, %0" \ - : "=r" (var) \ - : "0" (var), \ - "i" (offsetof (tcbhead_t, \ - pointer_guard))) -# define PTR_DEMANGLE(var) asm ("rorl $9, %0\n" \ - "xorl %%gs:%c2, %0" \ - : "=r" (var) \ - : "0" (var), \ - "i" (offsetof (tcbhead_t, \ - pointer_guard))) -# endif -#endif - /* Each shadow stack slot takes 4 bytes. Assuming that each stack frame takes 128 bytes, this is used to compute shadow stack size from stack size. */ diff --git a/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S b/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S index 9511c15945..4ef5129623 100644 --- a/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S +++ b/sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S @@ -15,6 +15,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <features.h> LEAF(__ia64_flush_rbs) diff --git a/sysdeps/unix/sysv/linux/ia64/__longjmp.S b/sysdeps/unix/sysv/linux/ia64/__longjmp.S index 793dc98cc1..da9653d8a7 100644 --- a/sysdeps/unix/sysv/linux/ia64/__longjmp.S +++ b/sysdeps/unix/sysv/linux/ia64/__longjmp.S @@ -31,6 +31,7 @@ bits into ar.rnat after setting ar.bspstore. */ #include <sysdep.h> +#include <pointer_guard.h> #include <features.h> # define pPos p6 /* is rotate count positive? */ diff --git a/sysdeps/unix/sysv/linux/ia64/pointer_guard.h b/sysdeps/unix/sysv/linux/ia64/pointer_guard.h new file mode 100644 index 0000000000..8631f39374 --- /dev/null +++ b/sysdeps/unix/sysv/linux/ia64/pointer_guard.h @@ -0,0 +1,44 @@ +/* Pointer obfuscation implenentation. ia64 version. + Copyright (C) 2005-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 + +#if IS_IN (rtld) +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ +# include <sysdeps/generic/pointer_guard.h> +#else +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(reg, tmpreg) \ + add tmpreg=-16,r13 \ + ;; \ + ld8 tmpreg=[tmpreg] \ + ;; \ + xor reg=reg, tmpreg +# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg) +# else +# include <stdint.h> +# include <tls.h> +# define PTR_MANGLE(var) \ + (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/ia64/setjmp.S b/sysdeps/unix/sysv/linux/ia64/setjmp.S index c29a31f7a6..a978dd4360 100644 --- a/sysdeps/unix/sysv/linux/ia64/setjmp.S +++ b/sysdeps/unix/sysv/linux/ia64/setjmp.S @@ -63,6 +63,7 @@ 0x1c0 f31 */ #include <sysdep.h> +#include <pointer_guard.h> #include <features.h> /* The following two entry points are the traditional entry points: */ diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.h b/sysdeps/unix/sysv/linux/ia64/sysdep.h index 14adbdf4ff..b450c6c224 100644 --- a/sysdeps/unix/sysv/linux/ia64/sysdep.h +++ b/sysdeps/unix/sysv/linux/ia64/sysdep.h @@ -324,24 +324,4 @@ #endif /* not __ASSEMBLER__ */ -/* Pointer mangling support. */ -#if IS_IN (rtld) -/* We cannot use the thread descriptor because in ld.so we use setjmp - earlier than the descriptor is initialized. */ -#else -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(reg, tmpreg) \ - add tmpreg=-16,r13 \ - ;; \ - ld8 tmpreg=[tmpreg] \ - ;; \ - xor reg=reg, tmpreg -# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg) -# else -# define PTR_MANGLE(var) \ - (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#endif - #endif /* linux/ia64/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h b/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h new file mode 100644 index 0000000000..4b2ed46167 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h @@ -0,0 +1,82 @@ +/* Pointer obfuscation implenentation. LoongArch version. + Copyright (C) 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 + +/* Load a got-relative EXPR into G, using T. + Note G and T are register names. */ +#define LD_GLOBAL(G, EXPR) \ + la.global G, EXPR; \ + REG_L G, G, 0; + +/* Load a pc-relative EXPR into G, using T. + Note G and T are register names. */ +#define LD_PCREL(G, EXPR) \ + la.pcrel G, EXPR; \ + REG_L G, G, 0; + +#if (IS_IN (rtld) \ + || (!defined SHARED && (IS_IN (libc) \ + || IS_IN (libpthread)))) + +#ifdef __ASSEMBLER__ +#define PTR_MANGLE(dst, src, guard) \ + LD_PCREL (guard, __pointer_chk_guard_local); \ + PTR_MANGLE2 (dst, src, guard); +#define PTR_DEMANGLE(dst, src, guard) \ + LD_PCREL (guard, __pointer_chk_guard_local); \ + PTR_DEMANGLE2 (dst, src, guard); +/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ +#define PTR_MANGLE2(dst, src, guard) \ + xor dst, src, guard; +#define PTR_DEMANGLE2(dst, src, guard) \ + PTR_MANGLE2 (dst, src, guard); +#else +# include <stdint.h> +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__ +#define PTR_MANGLE(dst, src, guard) \ + LD_GLOBAL (guard, __pointer_chk_guard); \ + PTR_MANGLE2 (dst, src, guard); +#define PTR_DEMANGLE(dst, src, guard) \ + LD_GLOBAL (guard, __pointer_chk_guard); \ + PTR_DEMANGLE2 (dst, src, guard); +/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ +#define PTR_MANGLE2(dst, src, guard) \ + xor dst, src, guard; +#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/loongarch/sysdep.h b/sysdeps/unix/sysv/linux/loongarch/sysdep.h index f4a1d23a97..09f8243f25 100644 --- a/sysdeps/unix/sysv/linux/loongarch/sysdep.h +++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h @@ -314,64 +314,4 @@ extern long int __syscall_error (long int neg_errno); #endif /* ! __ASSEMBLER__ */ -/* Pointer mangling is supported for LoongArch. */ - -/* Load a got-relative EXPR into G, using T. - Note G and T are register names. */ -#define LD_GLOBAL(G, EXPR) \ - la.global G, EXPR; \ - REG_L G, G, 0; - -/* Load a pc-relative EXPR into G, using T. - Note G and T are register names. */ -#define LD_PCREL(G, EXPR) \ - la.pcrel G, EXPR; \ - REG_L G, G, 0; - -#if (IS_IN (rtld) \ - || (!defined SHARED && (IS_IN (libc) \ - || IS_IN (libpthread)))) - -#ifdef __ASSEMBLER__ -#define PTR_MANGLE(dst, src, guard) \ - LD_PCREL (guard, __pointer_chk_guard_local); \ - PTR_MANGLE2 (dst, src, guard); -#define PTR_DEMANGLE(dst, src, guard) \ - LD_PCREL (guard, __pointer_chk_guard_local); \ - PTR_DEMANGLE2 (dst, src, guard); -/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ -#define PTR_MANGLE2(dst, src, guard) \ - xor dst, src, guard; -#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__ -#define PTR_MANGLE(dst, src, guard) \ - LD_GLOBAL (guard, __pointer_chk_guard); \ - PTR_MANGLE2 (dst, src, guard); -#define PTR_DEMANGLE(dst, src, guard) \ - LD_GLOBAL (guard, __pointer_chk_guard); \ - PTR_DEMANGLE2 (dst, src, guard); -/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ -#define PTR_MANGLE2(dst, src, guard) \ - xor dst, src, guard; -#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/loongarch/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep.h b/sysdeps/unix/sysv/linux/m68k/sysdep.h index d87892a377..064240330a 100644 --- a/sysdeps/unix/sysv/linux/m68k/sysdep.h +++ b/sysdeps/unix/sysv/linux/m68k/sysdep.h @@ -295,10 +295,6 @@ SYSCALL_ERROR_LABEL: \ #endif /* not __ASSEMBLER__ */ -/* Pointer mangling is not yet supported for M68K. */ -#define PTR_MANGLE(var) (void) (var) -#define PTR_DEMANGLE(var) (void) (var) - /* M68K needs system-supplied DSO to access TLS helpers even when statically linked. */ #define NEED_STATIC_SYSINFO_DSO 1 diff --git a/sysdeps/unix/sysv/linux/microblaze/sysdep.h b/sysdeps/unix/sysv/linux/microblaze/sysdep.h index fda78f6467..19805f6b5d 100644 --- a/sysdeps/unix/sysv/linux/microblaze/sysdep.h +++ b/sysdeps/unix/sysv/linux/microblaze/sysdep.h @@ -304,10 +304,6 @@ SYSCALL_ERROR_LABEL_DCL: \ }) -/* Pointer mangling is not yet supported for Microblaze. */ -# define PTR_MANGLE(var) (void) (var) -# define PTR_DEMANGLE(var) (void) (var) - #undef HAVE_INTERNAL_BRK_ADDR_SYMBOL #define HAVE_INTERNAL_BRK_ADDR_SYMBOL 1 diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h index a2a93bc840..0ef410c3c9 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h +++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h @@ -337,8 +337,4 @@ libc_hidden_proto (__mips_syscall7, nomips16) #endif /* __ASSEMBLER__ */ -/* Pointer mangling is not yet supported for MIPS. */ -#define PTR_MANGLE(var) (void) (var) -#define PTR_DEMANGLE(var) (void) (var) - #endif /* linux/mips/mips32/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h index 2c16a6758d..e362f15300 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h +++ b/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h @@ -300,8 +300,4 @@ typedef long int __syscall_arg_t; #endif /* __ASSEMBLER__ */ -/* Pointer mangling is not yet supported for MIPS. */ -#define PTR_MANGLE(var) (void) (var) -#define PTR_DEMANGLE(var) (void) (var) - #endif /* linux/mips/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/nios2/pointer_guard.h b/sysdeps/unix/sysv/linux/nios2/pointer_guard.h new file mode 100644 index 0000000000..da17809592 --- /dev/null +++ b/sysdeps/unix/sysv/linux/nios2/pointer_guard.h @@ -0,0 +1,40 @@ +/* Pointer obfuscation implenentation. Nios II version. + Copyright (C) 2015-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 + +#if IS_IN (rtld) +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ +# include <sysdeps/generic/pointer_guard.h> +#else +# ifdef __ASSEMBLER__ +# define PTR_MANGLE_GUARD(guard) ldw guard, POINTER_GUARD(r23) +# define PTR_MANGLE(dst, src, guard) xor dst, src, guard +# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard) +# else +# include <stdint.h> +# include <tls.h> +# define PTR_MANGLE(var) \ + (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/nios2/sysdep.h b/sysdeps/unix/sysv/linux/nios2/sysdep.h index 5fe960c2a5..46667b9c19 100644 --- a/sysdeps/unix/sysv/linux/nios2/sysdep.h +++ b/sysdeps/unix/sysv/linux/nios2/sysdep.h @@ -220,21 +220,4 @@ #endif /* __ASSEMBLER__ */ -/* Pointer mangling support. */ -#if IS_IN (rtld) -/* We cannot use the thread descriptor because in ld.so we use setjmp - earlier than the descriptor is initialized. */ -#else -# ifdef __ASSEMBLER__ -# define PTR_MANGLE_GUARD(guard) ldw guard, POINTER_GUARD(r23) -# define PTR_MANGLE(dst, src, guard) xor dst, src, guard -# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard) -# else -# define PTR_MANGLE(var) \ - (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#endif - - #endif /* linux/nios2/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/or1k/sysdep.h b/sysdeps/unix/sysv/linux/or1k/sysdep.h index 941c934554..b1fdf2a806 100644 --- a/sysdeps/unix/sysv/linux/or1k/sysdep.h +++ b/sysdeps/unix/sysv/linux/or1k/sysdep.h @@ -119,10 +119,6 @@ L(pseudo_end): \ extern long int __syscall_error (long int neg_errno); -/* Pointer mangling is not yet supported for or1k. */ -#define PTR_MANGLE(var) (void) (var) -#define PTR_DEMANGLE(var) (void) (var) - #undef INTERNAL_SYSCALL #define INTERNAL_SYSCALL(name, nr, args...) \ INTERNAL_SYSCALL_NCS (SYS_ify (name), nr, args) diff --git a/sysdeps/unix/sysv/linux/powerpc/pointer_guard.h b/sysdeps/unix/sysv/linux/powerpc/pointer_guard.h new file mode 100644 index 0000000000..5961793c0d --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/pointer_guard.h @@ -0,0 +1,55 @@ +/* Pointer obfuscation implenentation. PowerpC version. + Copyright (C) 2005-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 + +#if IS_IN (rtld) +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ +# include <sysdeps/generic/pointer_guard.h> +#else +# ifdef __ASSEMBLER__ +# if defined(__PPC64__) || defined(__powerpc64__) +# define LOAD ld +# define TPREG r13 +# else +# define LOAD lwz +# define TPREG r2 +# endif +# define PTR_MANGLE(reg, tmpreg) \ + LOAD tmpreg,POINTER_GUARD(TPREG); \ + xor reg,tmpreg,reg +# define PTR_MANGLE2(reg, tmpreg) \ + xor reg,tmpreg,reg +# define PTR_MANGLE3(destreg, reg, tmpreg) \ + LOAD tmpreg,POINTER_GUARD(TPREG); \ + xor destreg,tmpreg,reg +# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg) +# define PTR_DEMANGLE2(reg, tmpreg) PTR_MANGLE2 (reg, tmpreg) +# define PTR_DEMANGLE3(destreg, reg, tmpreg) PTR_MANGLE3 (destreg, reg, tmpreg) +# else +# include <stdint.h> +# include <tls.h> +# define PTR_MANGLE(var) \ + (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h index 4fb135aa8d..9e44818978 100644 --- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h @@ -207,38 +207,6 @@ #define ASM_INPUT_5 ASM_INPUT_4, "5" (r7) #define ASM_INPUT_6 ASM_INPUT_5, "6" (r8) - -/* Pointer mangling support. */ -#if IS_IN (rtld) -/* We cannot use the thread descriptor because in ld.so we use setjmp - earlier than the descriptor is initialized. */ -#else -# ifdef __ASSEMBLER__ -# if defined(__PPC64__) || defined(__powerpc64__) -# define LOAD ld -# define TPREG r13 -# else -# define LOAD lwz -# define TPREG r2 -# endif -# define PTR_MANGLE(reg, tmpreg) \ - LOAD tmpreg,POINTER_GUARD(TPREG); \ - xor reg,tmpreg,reg -# define PTR_MANGLE2(reg, tmpreg) \ - xor reg,tmpreg,reg -# define PTR_MANGLE3(destreg, reg, tmpreg) \ - LOAD tmpreg,POINTER_GUARD(TPREG); \ - xor destreg,tmpreg,reg -# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg) -# define PTR_DEMANGLE2(reg, tmpreg) PTR_MANGLE2 (reg, tmpreg) -# define PTR_DEMANGLE3(destreg, reg, tmpreg) PTR_MANGLE3 (destreg, reg, tmpreg) -# else -# define PTR_MANGLE(var) \ - (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#endif - /* List of system calls which are supported as vsyscalls. */ #define VDSO_NAME "LINUX_2.6.15" #define VDSO_HASH 123718565 diff --git a/sysdeps/unix/sysv/linux/riscv/sysdep.h b/sysdeps/unix/sysv/linux/riscv/sysdep.h index 9b03b10567..c9af888132 100644 --- a/sysdeps/unix/sysv/linux/riscv/sysdep.h +++ b/sysdeps/unix/sysv/linux/riscv/sysdep.h @@ -357,8 +357,4 @@ extern long int __syscall_error (long int neg_errno); #endif /* ! __ASSEMBLER__ */ -/* Pointer mangling is not supported. */ -#define PTR_MANGLE(var) (void) (var) -#define PTR_DEMANGLE(var) (void) (var) - #endif /* linux/riscv/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h b/sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h new file mode 100644 index 0000000000..0e85d4ccbb --- /dev/null +++ b/sysdeps/unix/sysv/linux/s390/s390-32/pointer_guard.h @@ -0,0 +1,45 @@ +/* Pointer obfuscation implenentation. s390 version. + Copyright (C) 2005-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 + +#if IS_IN (rtld) +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ +# include <sysdeps/generic/pointer_guard.h> +#else +/* For the time being just use stack_guard rather than a separate + pointer_guard. */ +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(reg, tmpreg) \ + ear tmpreg,%a0; \ + x reg,STACK_GUARD(tmpreg) +# define PTR_MANGLE2(reg, tmpreg) \ + x reg,STACK_GUARD(tmpreg) +# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg) +# else +# include <stdint.h> +# include <tls.h> +# define PTR_MANGLE(var) \ + (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h index e41106b377..a24fde7c6d 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h @@ -177,25 +177,4 @@ #endif /* __ASSEMBLER__ */ -/* Pointer mangling support. */ -#if IS_IN (rtld) -/* We cannot use the thread descriptor because in ld.so we use setjmp - earlier than the descriptor is initialized. */ -#else -/* For the time being just use stack_guard rather than a separate - pointer_guard. */ -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(reg, tmpreg) \ - ear tmpreg,%a0; \ - x reg,STACK_GUARD(tmpreg) -# define PTR_MANGLE2(reg, tmpreg) \ - x reg,STACK_GUARD(tmpreg) -# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg) -# else -# define PTR_MANGLE(var) \ - (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#endif - #endif /* _LINUX_S390_SYSDEP_H */ diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h b/sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h new file mode 100644 index 0000000000..5285456806 --- /dev/null +++ b/sysdeps/unix/sysv/linux/s390/s390-64/pointer_guard.h @@ -0,0 +1,47 @@ +/* Pointer obfuscation implenentation. s390x version. + Copyright (C) 2005-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 + +#if IS_IN (rtld) +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ +# include <sysdeps/generic/pointer_guard.h> +#else +/* For the time being just use stack_guard rather than a separate + pointer_guard. */ +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(reg, tmpreg) \ + ear tmpreg,%a0; \ + sllg tmpreg,tmpreg,32; \ + ear tmpreg,%a1; \ + xg reg,STACK_GUARD(tmpreg) +# define PTR_MANGLE2(reg, tmpreg) \ + xg reg,STACK_GUARD(tmpreg) +# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg) +# else +# include <stdint.h> +# include <tls.h> +# define PTR_MANGLE(var) \ + (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h index 150e33981a..79bc0fa4a6 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h @@ -175,27 +175,4 @@ #endif /* __ASSEMBLER__ */ -/* Pointer mangling support. */ -#if IS_IN (rtld) -/* We cannot use the thread descriptor because in ld.so we use setjmp - earlier than the descriptor is initialized. */ -#else -/* For the time being just use stack_guard rather than a separate - pointer_guard. */ -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(reg, tmpreg) \ - ear tmpreg,%a0; \ - sllg tmpreg,tmpreg,32; \ - ear tmpreg,%a1; \ - xg reg,STACK_GUARD(tmpreg) -# define PTR_MANGLE2(reg, tmpreg) \ - xg reg,STACK_GUARD(tmpreg) -# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg) -# else -# define PTR_MANGLE(var) \ - (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#endif - #endif /* _LINUX_S390_SYSDEP_H */ diff --git a/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S b/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S index e821e158c4..cf69926316 100644 --- a/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S +++ b/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S @@ -16,6 +16,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <sigaltstack-offsets.h> diff --git a/sysdeps/unix/sysv/linux/sh/pointer_guard.h b/sysdeps/unix/sysv/linux/sh/pointer_guard.h new file mode 100644 index 0000000000..32a571d496 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/pointer_guard.h @@ -0,0 +1,43 @@ +/* Pointer obfuscation implenentation. Generic (no-op) version. + Copyright (C) 2005-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 + +#if IS_IN (rtld) +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. Using a global variable + is too complicated here since we have no PC-relative addressing mode. */ +# include <sysdeps/generic/pointer_guard.h> +#else +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(reg, tmp) \ + stc gbr,tmp; mov.l @(POINTER_GUARD,tmp),tmp; xor tmp,reg +# define PTR_MANGLE2(reg, tmp) xor tmp,reg +# define PTR_DEMANGLE(reg, tmp) PTR_MANGLE (reg, tmp) +# define PTR_DEMANGLE2(reg, tmp) PTR_MANGLE2 (reg, tmp) +# else +# include <stdint.h> +# include <tls.h> +# define PTR_MANGLE(var) \ + (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.h b/sysdeps/unix/sysv/linux/sh/sysdep.h index e9e13cd184..a2f43f68c3 100644 --- a/sysdeps/unix/sysv/linux/sh/sysdep.h +++ b/sysdeps/unix/sysv/linux/sh/sysdep.h @@ -315,23 +315,4 @@ #endif /* __ASSEMBLER__ */ -/* Pointer mangling support. */ -#if IS_IN (rtld) -/* We cannot use the thread descriptor because in ld.so we use setjmp - earlier than the descriptor is initialized. Using a global variable - is too complicated here since we have no PC-relative addressing mode. */ -#else -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(reg, tmp) \ - stc gbr,tmp; mov.l @(POINTER_GUARD,tmp),tmp; xor tmp,reg -# define PTR_MANGLE2(reg, tmp) xor tmp,reg -# define PTR_DEMANGLE(reg, tmp) PTR_MANGLE (reg, tmp) -# define PTR_DEMANGLE2(reg, tmp) PTR_MANGLE2 (reg, tmp) -# else -# define PTR_MANGLE(var) \ - (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#endif - #endif /* linux/sh/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S b/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S index 8e8cb4d751..ad23840bcd 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S @@ -16,6 +16,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #define ENV(base,reg) [%base + (reg * 4)] diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h b/sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h new file mode 100644 index 0000000000..4063513cd8 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/pointer_guard.h @@ -0,0 +1,44 @@ +/* Pointer obfuscation implenentation. 32-bit SPARC version. + Copyright (C) 2006-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 + +#if IS_IN (rtld) +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ +# include <sysdeps/generic/pointer_guard.h> +#else +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(dreg, reg, tmpreg) \ + ld [%g7 + POINTER_GUARD], tmpreg; \ + xor reg, tmpreg, dreg +# define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg) +# define PTR_MANGLE2(dreg, reg, tmpreg) \ + xor reg, tmpreg, dreg +# define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg) +# else +# include <stdint.h> +# include <tls.h> +# define PTR_MANGLE(var) \ + (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h index 032608a4e0..1783af8178 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h @@ -125,24 +125,4 @@ ENTRY(name); \ #endif /* __ASSEMBLER__ */ -/* Pointer mangling support. */ -#if IS_IN (rtld) -/* We cannot use the thread descriptor because in ld.so we use setjmp - earlier than the descriptor is initialized. */ -#else -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(dreg, reg, tmpreg) \ - ld [%g7 + POINTER_GUARD], tmpreg; \ - xor reg, tmpreg, dreg -# define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg) -# define PTR_MANGLE2(dreg, reg, tmpreg) \ - xor reg, tmpreg, dreg -# define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg) -# else -# define PTR_MANGLE(var) \ - (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#endif - #endif /* linux/sparc/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h b/sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h new file mode 100644 index 0000000000..7865e87c73 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/pointer_guard.h @@ -0,0 +1,44 @@ +/* Pointer obfuscation implenentation. 64-bit SPARC version. + Copyright (C) 2006-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 + +#if IS_IN (rtld) +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ +# include <sysdeps/generic/pointer_guard.h> +#else +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(dreg, reg, tmpreg) \ + ldx [%g7 + POINTER_GUARD], tmpreg; \ + xor reg, tmpreg, dreg +# define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg) +# define PTR_MANGLE2(dreg, reg, tmpreg) \ + xor reg, tmpreg, dreg +# define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg) +# else +# include <stdint.h> +# include <tls.h> +# define PTR_MANGLE(var) \ + (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h index 4aaa2912ce..4ae22ae25b 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h @@ -127,24 +127,4 @@ ENTRY(name); \ register windows. So if you poke stack memory directly you add this. */ #define STACK_BIAS 2047 -/* Pointer mangling support. */ -#if IS_IN (rtld) -/* We cannot use the thread descriptor because in ld.so we use setjmp - earlier than the descriptor is initialized. */ -#else -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(dreg, reg, tmpreg) \ - ldx [%g7 + POINTER_GUARD], tmpreg; \ - xor reg, tmpreg, dreg -# define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg) -# define PTR_MANGLE2(dreg, reg, tmpreg) \ - xor reg, tmpreg, dreg -# define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg) -# else -# define PTR_MANGLE(var) \ - (var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) -# define PTR_DEMANGLE(var) PTR_MANGLE (var) -# endif -#endif - #endif /* linux/sparc64/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S index ffdf4624bf..5ff275c436 100644 --- a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S +++ b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S @@ -16,6 +16,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <asm-syntax.h> #include <stap-probe.h> diff --git a/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h b/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h new file mode 100644 index 0000000000..2df3912897 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h @@ -0,0 +1,61 @@ +/* Pointer obfuscation implenentation. x86-64 version. + Copyright (C) 2005-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 + +#include <x86-lp_size.h> +#include <tcb-offsets.h> + +#if IS_IN (rtld) +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. */ +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(reg) xor __pointer_chk_guard_local(%rip), reg; \ + rol $2*LP_SIZE+1, reg +# define PTR_DEMANGLE(reg) ror $2*LP_SIZE+1, reg; \ + xor __pointer_chk_guard_local(%rip), reg +# else +# define PTR_MANGLE(reg) asm ("xor __pointer_chk_guard_local(%%rip), %0\n" \ + "rol $2*" LP_SIZE "+1, %0" \ + : "=r" (reg) : "0" (reg)) +# define PTR_DEMANGLE(reg) asm ("ror $2*" LP_SIZE "+1, %0\n" \ + "xor __pointer_chk_guard_local(%%rip), %0" \ + : "=r" (reg) : "0" (reg)) +# endif +#else +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(reg) xor %fs:POINTER_GUARD, reg; \ + rol $2*LP_SIZE+1, reg +# define PTR_DEMANGLE(reg) ror $2*LP_SIZE+1, reg; \ + xor %fs:POINTER_GUARD, reg +# else +# define PTR_MANGLE(var) asm ("xor %%fs:%c2, %0\n" \ + "rol $2*" LP_SIZE "+1, %0" \ + : "=r" (var) \ + : "0" (var), \ + "i" (POINTER_GUARD)) +# define PTR_DEMANGLE(var) asm ("ror $2*" LP_SIZE "+1, %0\n" \ + "xor %%fs:%c2, %0" \ + : "=r" (var) \ + : "0" (var), \ + "i" (POINTER_GUARD)) +# endif +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h index 740abefcfd..5e4d7827d7 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h @@ -381,46 +381,6 @@ #endif /* __ASSEMBLER__ */ - -/* Pointer mangling support. */ -#if IS_IN (rtld) -/* We cannot use the thread descriptor because in ld.so we use setjmp - earlier than the descriptor is initialized. */ -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(reg) xor __pointer_chk_guard_local(%rip), reg; \ - rol $2*LP_SIZE+1, reg -# define PTR_DEMANGLE(reg) ror $2*LP_SIZE+1, reg; \ - xor __pointer_chk_guard_local(%rip), reg -# else -# define PTR_MANGLE(reg) asm ("xor __pointer_chk_guard_local(%%rip), %0\n" \ - "rol $2*" LP_SIZE "+1, %0" \ - : "=r" (reg) : "0" (reg)) -# define PTR_DEMANGLE(reg) asm ("ror $2*" LP_SIZE "+1, %0\n" \ - "xor __pointer_chk_guard_local(%%rip), %0" \ - : "=r" (reg) : "0" (reg)) -# endif -#else -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(reg) xor %fs:POINTER_GUARD, reg; \ - rol $2*LP_SIZE+1, reg -# define PTR_DEMANGLE(reg) ror $2*LP_SIZE+1, reg; \ - xor %fs:POINTER_GUARD, reg -# else -# define PTR_MANGLE(var) asm ("xor %%fs:%c2, %0\n" \ - "rol $2*" LP_SIZE "+1, %0" \ - : "=r" (var) \ - : "0" (var), \ - "i" (offsetof (tcbhead_t, \ - pointer_guard))) -# define PTR_DEMANGLE(var) asm ("ror $2*" LP_SIZE "+1, %0\n" \ - "xor %%fs:%c2, %0" \ - : "=r" (var) \ - : "0" (var), \ - "i" (offsetof (tcbhead_t, \ - pointer_guard))) -# endif -#endif - /* How to pass the off{64}_t argument on p{readv,writev}{64}. */ #undef LO_HI_LONG #define LO_HI_LONG(val) (val), 0 diff --git a/sysdeps/x86_64/__longjmp.S b/sysdeps/x86_64/__longjmp.S index b51d79168c..6fdb4ccfbf 100644 --- a/sysdeps/x86_64/__longjmp.S +++ b/sysdeps/x86_64/__longjmp.S @@ -16,6 +16,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <jmp_buf-ssp.h> #include <asm-syntax.h> diff --git a/sysdeps/x86_64/jmpbuf-unwind.h b/sysdeps/x86_64/jmpbuf-unwind.h index 42ea37508e..c92b2633bc 100644 --- a/sysdeps/x86_64/jmpbuf-unwind.h +++ b/sysdeps/x86_64/jmpbuf-unwind.h @@ -20,6 +20,7 @@ #include <stdint.h> #include <unwind.h> #include <sysdep.h> +#include <pointer_guard.h> /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ diff --git a/sysdeps/x86_64/setjmp.S b/sysdeps/x86_64/setjmp.S index 1b77dcd4f9..3897e66dc4 100644 --- a/sysdeps/x86_64/setjmp.S +++ b/sysdeps/x86_64/setjmp.S @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <pointer_guard.h> #include <jmpbuf-offsets.h> #include <jmp_buf-ssp.h> #include <asm-syntax.h> diff --git a/wcsmbs/btowc.c b/wcsmbs/btowc.c index 21e52a67f4..7023ec99f1 100644 --- a/wcsmbs/btowc.c +++ b/wcsmbs/btowc.c @@ -24,7 +24,7 @@ #include <wcsmbsload.h> #include <limits.h> -#include <sysdep.h> +#include <pointer_guard.h> wint_t diff --git a/wcsmbs/mbrtoc16.c b/wcsmbs/mbrtoc16.c index b23d9b0160..f8b029b58a 100644 --- a/wcsmbs/mbrtoc16.c +++ b/wcsmbs/mbrtoc16.c @@ -22,7 +22,7 @@ #include <uchar.h> #include <wcsmbsload.h> -#include <sysdep.h> +#include <pointer_guard.h> #ifndef EILSEQ # define EILSEQ EINVAL diff --git a/wcsmbs/mbrtoc8.c b/wcsmbs/mbrtoc8.c index dd80b5282d..e745a49e09 100644 --- a/wcsmbs/mbrtoc8.c +++ b/wcsmbs/mbrtoc8.c @@ -23,8 +23,6 @@ #include <uchar.h> #include <wcsmbsload.h> -#include <sysdep.h> - #ifndef EILSEQ # define EILSEQ EINVAL #endif diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c index 78d9994f67..46a1cc38df 100644 --- a/wcsmbs/mbrtowc.c +++ b/wcsmbs/mbrtowc.c @@ -22,7 +22,7 @@ #include <wchar.h> #include <wcsmbsload.h> -#include <sysdep.h> +#include <pointer_guard.h> #ifndef EILSEQ # define EILSEQ EINVAL diff --git a/wcsmbs/mbsnrtowcs.c b/wcsmbs/mbsnrtowcs.c index 5860822400..06a1f2d36f 100644 --- a/wcsmbs/mbsnrtowcs.c +++ b/wcsmbs/mbsnrtowcs.c @@ -23,7 +23,7 @@ #include <wchar.h> #include <wcsmbsload.h> -#include <sysdep.h> +#include <pointer_guard.h> #ifndef EILSEQ # define EILSEQ EINVAL diff --git a/wcsmbs/mbsrtowcs_l.c b/wcsmbs/mbsrtowcs_l.c index 0ebc389fdb..526b88e1dd 100644 --- a/wcsmbs/mbsrtowcs_l.c +++ b/wcsmbs/mbsrtowcs_l.c @@ -27,7 +27,7 @@ #include <wchar.h> #include <wcsmbsload.h> -#include <sysdep.h> +#include <pointer_guard.h> #ifndef EILSEQ # define EILSEQ EINVAL diff --git a/wcsmbs/wcrtomb.c b/wcsmbs/wcrtomb.c index c0cce3792f..42690f2efd 100644 --- a/wcsmbs/wcrtomb.c +++ b/wcsmbs/wcrtomb.c @@ -25,7 +25,7 @@ #include <wchar.h> #include <wcsmbsload.h> -#include <sysdep.h> +#include <pointer_guard.h> #ifndef EILSEQ # define EILSEQ EINVAL diff --git a/wcsmbs/wcsnrtombs.c b/wcsmbs/wcsnrtombs.c index 9707f6f4bc..6ba180cdc2 100644 --- a/wcsmbs/wcsnrtombs.c +++ b/wcsmbs/wcsnrtombs.c @@ -22,7 +22,7 @@ #include <wchar.h> #include <wcsmbsload.h> -#include <sysdep.h> +#include <pointer_guard.h> #ifndef EILSEQ # define EILSEQ EINVAL diff --git a/wcsmbs/wcsrtombs.c b/wcsmbs/wcsrtombs.c index b1ac704b28..7db2b181b3 100644 --- a/wcsmbs/wcsrtombs.c +++ b/wcsmbs/wcsrtombs.c @@ -23,7 +23,7 @@ #include <wchar.h> #include <wcsmbsload.h> -#include <sysdep.h> +#include <pointer_guard.h> #ifndef EILSEQ # define EILSEQ EINVAL diff --git a/wcsmbs/wctob.c b/wcsmbs/wctob.c index 573c2c9448..5dfbd7ab7e 100644 --- a/wcsmbs/wctob.c +++ b/wcsmbs/wctob.c @@ -22,7 +22,7 @@ #include <wchar.h> #include <wcsmbsload.h> -#include <sysdep.h> +#include <pointer_guard.h> int |