From 0af6e5facdcc534e097bbe8f565ad827f159f604 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Wed, 12 Dec 2018 22:10:52 +0000 Subject: [PATCH] [hwasan] Verify Android TLS slot at startup. Summary: Add a check that TLS_SLOT_TSAN / TLS_SLOT_SANITIZER, whichever android_get_tls_slot is using, is not conflicting with TLS_SLOT_DLERROR. Reviewers: rprichard, vitalybuka Subscribers: srhines, kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D55587 llvm-svn: 348979 --- compiler-rt/lib/hwasan/hwasan.cc | 2 ++ compiler-rt/lib/hwasan/hwasan.h | 2 ++ compiler-rt/lib/hwasan/hwasan_linux.cc | 17 +++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/compiler-rt/lib/hwasan/hwasan.cc b/compiler-rt/lib/hwasan/hwasan.cc index 7a96bb2..da95891 100644 --- a/compiler-rt/lib/hwasan/hwasan.cc +++ b/compiler-rt/lib/hwasan/hwasan.cc @@ -283,6 +283,8 @@ void __hwasan_init() { __sanitizer_set_report_path(common_flags()->log_path); + AndroidTestTlsSlot(); + DisableCoreDumperIfNecessary(); __hwasan_shadow_init(); diff --git a/compiler-rt/lib/hwasan/hwasan.h b/compiler-rt/lib/hwasan/hwasan.h index b33ce83..64b1f1a 100644 --- a/compiler-rt/lib/hwasan/hwasan.h +++ b/compiler-rt/lib/hwasan/hwasan.h @@ -154,6 +154,8 @@ void UpdateMemoryUsage(); void AppendToErrorMessageBuffer(const char *buffer); +void AndroidTestTlsSlot(); + } // namespace __hwasan #define HWASAN_MALLOC_HOOK(ptr, size) \ diff --git a/compiler-rt/lib/hwasan/hwasan_linux.cc b/compiler-rt/lib/hwasan/hwasan_linux.cc index 750d11d..af9378c 100644 --- a/compiler-rt/lib/hwasan/hwasan_linux.cc +++ b/compiler-rt/lib/hwasan/hwasan_linux.cc @@ -24,6 +24,7 @@ #include "hwasan_thread.h" #include "hwasan_thread_list.h" +#include #include #include #include @@ -283,6 +284,22 @@ uptr *GetCurrentThreadLongPtr() { } #endif +#if SANITIZER_ANDROID +void AndroidTestTlsSlot() { + uptr kMagicValue = 0x010203040A0B0C0D; + *(uptr *)get_android_tls_ptr() = kMagicValue; + dlerror(); + if (*(uptr *)get_android_tls_ptr() != kMagicValue) { + Printf( + "ERROR: Incompatible version of Android: TLS_SLOT_SANITIZER(6) is used " + "for dlerror().\n"); + Die(); + } +} +#else +void AndroidTestTlsSlot() {} +#endif + Thread *GetCurrentThread() { auto *R = (StackAllocationsRingBuffer*)GetCurrentThreadLongPtr(); return hwasanThreadList().GetThreadByBufferAddress((uptr)(R->Next())); -- 2.7.4