From 1a4fc2413fbe789f4b5bbff50c1fcc234fb304ee Mon Sep 17 00:00:00 2001 From: Julian Lettner Date: Tue, 9 Jul 2019 18:42:01 +0000 Subject: Revert "[TSan] Improve handling of stack pointer mangling in {set,long}jmp, pt.8" This reverts commit 521f77e6351fd921f5a81027c7c72addca378989. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@365534 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/tsan/rtl/tsan_platform_linux.cc | 50 ++++--------------------------------- lib/tsan/rtl/tsan_platform_mac.cc | 11 ++++---- 2 files changed, 10 insertions(+), 51 deletions(-) diff --git a/lib/tsan/rtl/tsan_platform_linux.cc b/lib/tsan/rtl/tsan_platform_linux.cc index 1373037ed..71f6f4872 100644 --- a/lib/tsan/rtl/tsan_platform_linux.cc +++ b/lib/tsan/rtl/tsan_platform_linux.cc @@ -68,17 +68,12 @@ void *__libc_stack_end = 0; #endif #if SANITIZER_LINUX && defined(__aarch64__) -__tsan::uptr InitializeGuardPtr() __attribute__((visibility("hidden"))); +void InitializeGuardPtr() __attribute__((visibility("hidden"))); extern "C" __tsan::uptr _tsan_pointer_chk_guard; #endif namespace __tsan { -#if SANITIZER_LINUX && defined(__aarch64__) -static void InitializeLongjmpXorKey(); -static uptr longjmp_xor_key; -#endif - #ifdef TSAN_RUNTIME_VMA // Runtime detected VMA size. uptr vmaSize; @@ -290,25 +285,7 @@ void InitializePlatform() { reexec = true; } // Initialize the guard pointer used in {sig}{set,long}jump. - longjmp_xor_key = InitializeGuardPtr(); - uptr old_value = longjmp_xor_key; - InitializeLongjmpXorKey(); - CHECK_EQ(longjmp_xor_key, old_value); - // If the above check fails for you, please contact me (jlettner@apple.com) - // and let me know the values of the two differing keys. Please also set a - // breakpoint on `InitializeGuardPtr` and `InitializeLongjmpXorKey` and tell - // me the stack pointer (SP) values that go into the XOR operation (where we - // derive the key): - // - // InitializeLongjmpXorKey: - // uptr sp = (uptr)__builtin_frame_address(0); - // - // InitializeGuardPtr (in tsan_rtl_aarch64.S): - // mov x0, sp - // ... - // eor x0, x0, x1 - // - // Then feel free to comment out the call to `InitializeLongjmpXorKey`. + InitializeGuardPtr(); #endif if (reexec) ReExec(); @@ -376,7 +353,9 @@ static uptr UnmangleLongJmpSp(uptr mangled_sp) { # endif #elif defined(__aarch64__) # if SANITIZER_LINUX - return mangled_sp ^ longjmp_xor_key; + // TODO(yln): fix this + // return mangled_sp ^ _tsan_pointer_chk_guard; + return mangled_sp; # else return mangled_sp; # endif @@ -415,25 +394,6 @@ uptr ExtractLongJmpSp(uptr *env) { return UnmangleLongJmpSp(mangled_sp); } -#if SANITIZER_LINUX && defined(__aarch64__) -// GLIBC mangles the function pointers in jmp_buf (used in {set,long}*jmp -// functions) by XORing them with a random key. For AArch64 it is a global -// variable rather than a TCB one (as for x86_64/powerpc). We obtain the key by -// issuing a setjmp and XORing the SP pointer values to derive the key. -static void InitializeLongjmpXorKey() { - // 1. Call REAL(setjmp), which stores the mangled SP in env. - jump_buf env; - REAL(setjmp)(env); - - // 2. Retrieve mangled/vanilla SP. - uptr mangled_sp = ((uptr *)&env)[LONG_JMP_SP_ENV_SLOT]; - uptr sp = (uptr)__builtin_frame_address(0); - - // 3. xor SPs to obtain key. - longjmp_xor_key = mangled_sp ^ sp; -} -#endif - void ImitateTlsWrite(ThreadState *thr, uptr tls_addr, uptr tls_size) { // Check that the thr object is in tls; const uptr thr_beg = (uptr)thr; diff --git a/lib/tsan/rtl/tsan_platform_mac.cc b/lib/tsan/rtl/tsan_platform_mac.cc index 0c2d2aa93..e43a9ec34 100644 --- a/lib/tsan/rtl/tsan_platform_mac.cc +++ b/lib/tsan/rtl/tsan_platform_mac.cc @@ -238,7 +238,8 @@ void InitializePlatformEarly() { #endif } -static uptr longjmp_xor_key = 0; +static const uptr kPthreadSetjmpXorKeySlot = 0x7; +extern "C" uptr __tsan_darwin_setjmp_xor_key = 0; void InitializePlatform() { DisableCoreDumperIfNecessary(); @@ -253,9 +254,8 @@ void InitializePlatform() { #endif if (GetMacosVersion() >= MACOS_VERSION_MOJAVE) { - // Libsystem currently uses a process-global key; this might change. - const unsigned kTLSLongjmpXorKeySlot = 0x7; - longjmp_xor_key = (uptr)pthread_getspecific(kTLSLongjmpXorKeySlot); + __tsan_darwin_setjmp_xor_key = + (uptr)pthread_getspecific(kPthreadSetjmpXorKeySlot); } } @@ -268,8 +268,7 @@ void InitializePlatform() { uptr ExtractLongJmpSp(uptr *env) { uptr mangled_sp = env[LONG_JMP_SP_ENV_SLOT]; - uptr sp = mangled_sp ^ longjmp_xor_key; - return sp; + return mangled_sp ^ __tsan_darwin_setjmp_xor_key; } #if !SANITIZER_GO -- cgit v1.2.1