forked from OSchip/llvm-project
[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
This commit is contained in:
parent
6b22f59207
commit
0af6e5facd
|
@ -283,6 +283,8 @@ void __hwasan_init() {
|
|||
|
||||
__sanitizer_set_report_path(common_flags()->log_path);
|
||||
|
||||
AndroidTestTlsSlot();
|
||||
|
||||
DisableCoreDumperIfNecessary();
|
||||
|
||||
__hwasan_shadow_init();
|
||||
|
|
|
@ -154,6 +154,8 @@ void UpdateMemoryUsage();
|
|||
|
||||
void AppendToErrorMessageBuffer(const char *buffer);
|
||||
|
||||
void AndroidTestTlsSlot();
|
||||
|
||||
} // namespace __hwasan
|
||||
|
||||
#define HWASAN_MALLOC_HOOK(ptr, size) \
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "hwasan_thread.h"
|
||||
#include "hwasan_thread_list.h"
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <elf.h>
|
||||
#include <link.h>
|
||||
#include <pthread.h>
|
||||
|
@ -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()));
|
||||
|
|
Loading…
Reference in New Issue