[HWASAN] Set os_id in Thread::Init to make sure that the thread can be found by GetTh...
authorKirill Stoimenov <kstoimenov@google.com>
Thu, 2 Feb 2023 01:32:16 +0000 (01:32 +0000)
committerKirill Stoimenov <kstoimenov@google.com>
Thu, 2 Feb 2023 01:42:48 +0000 (01:42 +0000)
Reviewed By: vitalybuka

Differential Revision: https://reviews.llvm.org/D143125

12 files changed:
compiler-rt/lib/hwasan/hwasan_interceptors.cpp
compiler-rt/lib/hwasan/hwasan_thread.cpp
compiler-rt/lib/hwasan/hwasan_thread.h
compiler-rt/test/lsan/TestCases/Linux/cleanup_in_tsd_destructor.c
compiler-rt/test/lsan/TestCases/Linux/fork_threaded.cpp
compiler-rt/test/lsan/TestCases/Linux/guard-page.c
compiler-rt/test/lsan/TestCases/Linux/libdl_deadlock.cpp
compiler-rt/test/lsan/TestCases/many_tls_keys_pthread.cpp
compiler-rt/test/lsan/TestCases/many_tls_keys_thread.cpp
compiler-rt/test/lsan/TestCases/use_registers.cpp
compiler-rt/test/lsan/TestCases/use_registers_extra.cpp
compiler-rt/test/lsan/TestCases/use_stacks_threaded.cpp

index 05bf3f2..c1ed2cd 100644 (file)
@@ -39,6 +39,7 @@ static void *HwasanThreadStartFunc(void *arg) {
 
 INTERCEPTOR(int, pthread_create, void *th, void *attr, void *(*callback)(void*),
             void * param) {
+  EnsureMainThreadIDIsCorrect();
   ScopedTaggingDisabler disabler;
   ThreadStartArg *A = reinterpret_cast<ThreadStartArg *> (MmapOrDie(
       GetPageSizeCached(), "pthread_create"));
index 4a78f60..3375782 100644 (file)
@@ -44,6 +44,8 @@ void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size,
 
   static atomic_uint64_t unique_id;
   unique_id_ = atomic_fetch_add(&unique_id, 1, memory_order_relaxed);
+  if (!IsMainThread())
+    os_id_ = GetTid();
 
   if (auto sz = flags()->heap_history_size)
     heap_allocations_ = HeapAllocationsRingBuffer::New(sz);
@@ -149,6 +151,12 @@ tag_t Thread::GenerateRandomTag(uptr num_bits) {
   return tag;
 }
 
+void EnsureMainThreadIDIsCorrect() {
+  auto *t = __hwasan::GetCurrentThread();
+  if (t && (t->IsMainThread()))
+    t->set_os_id(GetTid());
+}
+
 } // namespace __hwasan
 
 // --- Implementation of LSan-specific functions --- {{{1
@@ -169,11 +177,7 @@ void LockThreadRegistry() { __hwasan::hwasanThreadList().Lock(); }
 
 void UnlockThreadRegistry() { __hwasan::hwasanThreadList().Unlock(); }
 
-void EnsureMainThreadIDIsCorrect() {
-  auto *t = __hwasan::GetCurrentThread();
-  if (t && (t->IsMainThread()))
-    t->set_os_id(GetTid());
-}
+void EnsureMainThreadIDIsCorrect() { __hwasan::EnsureMainThreadIDIsCorrect(); }
 
 bool GetThreadRangesLocked(tid_t os_id, uptr *stack_begin, uptr *stack_end,
                            uptr *tls_begin, uptr *tls_end, uptr *cache_begin,
index 9727585..9e1b438 100644 (file)
@@ -110,6 +110,9 @@ class Thread {
 Thread *GetCurrentThread();
 uptr *GetCurrentThreadLongPtr();
 
+// Used to handle fork().
+void EnsureMainThreadIDIsCorrect();
+
 struct ScopedTaggingDisabler {
   ScopedTaggingDisabler() { GetCurrentThread()->DisableTagging(); }
   ~ScopedTaggingDisabler() { GetCurrentThread()->EnableTagging(); }
index 29f6a48..00a0ec3 100644 (file)
@@ -7,9 +7,6 @@
 // RUN: %env_lsan_opts="report_objects=1:use_registers=0:use_stacks=0:use_tls=1" %run %t
 // RUN: %env_lsan_opts="report_objects=1:use_registers=0:use_stacks=0:use_tls=0" not %run %t 2>&1 | FileCheck %s
 
-// Fixme: remove once test passes with hwasan
-// UNSUPPORTED: hwasan
-
 // Investigate why it does not fail with use_stack=0
 // UNSUPPORTED: arm-linux || armhf-linux
 
index b80cfee..62702b4 100644 (file)
@@ -3,9 +3,6 @@
 // RUN: %clangxx_lsan %s -o %t
 // RUN: %run %t 2>&1
 
-// Fixme: remove once test passes with hwasan
-// UNSUPPORTED: hwasan
-
 #include <assert.h>
 #include <pthread.h>
 #include <stdio.h>
index dd2a581..ba03c1f 100644 (file)
@@ -1,9 +1,6 @@
 // Check that if LSan finds that SP doesn't point into thread stack (e.g.
 // if swapcontext is used), LSan will not hit the guard page.
 // RUN: %clang_lsan %s -o %t && %run %t
-
-// Fixme: remove once test passes with hwasan
-// UNSUPPORTED: hwasan
 // Missing 'getcontext' and 'makecontext' on Android.
 // UNSUPPORTED: android
 
index ddc9d88..ad7abe2 100644 (file)
@@ -2,9 +2,6 @@
 // where lsan would call dl_iterate_phdr while holding the allocator lock.
 // RUN: %clangxx_lsan %s -o %t && %run %t
 
-// Fixme: remove once test passes with hwasan
-// UNSUPPORTED: hwasan
-
 #include <link.h>
 #include <mutex>
 #include <stdlib.h>
index 86a2839..b67550f 100644 (file)
@@ -4,9 +4,6 @@
 // RUN: %env_lsan_opts="report_objects=1:use_stacks=0:use_registers=0:use_tls=1" %run %t 2>&1
 // RUN: %env_lsan_opts="" %run %t 2>&1
 
-// Fixme: remove once test passes with hwasan
-// UNSUPPORTED: hwasan
-
 // On glibc, this requires the range returned by GetTLS to include
 // specific_1stblock and specific in `struct pthread`.
 // UNSUPPORTED: arm-linux, armhf-linux
@@ -77,4 +74,4 @@ int main() {
 }
 
 // CHECK: LeakSanitizer: detected memory leaks
-// CHECK: SUMMARY: {{(Leak|Address)}}Sanitizer:
+// CHECK: SUMMARY: {{.*}}Sanitizer:
index dac1363..f0deb44 100644 (file)
@@ -4,9 +4,6 @@
 // RUN: %env_lsan_opts="report_objects=1:use_stacks=0:use_registers=0:use_tls=1" %run %t 2>&1
 // RUN: %env_lsan_opts="" %run %t 2>&1
 
-// Fixme: remove once test passes with hwasan
-// UNSUPPORTED: hwasan
-
 // Patch r303906 did not fix all the problems.
 // UNSUPPORTED: arm-linux,armhf-linux
 
@@ -60,4 +57,4 @@ int main() {
 }
 
 // CHECK: LeakSanitizer: detected memory leaks
-// CHECK: SUMMARY: {{(Leak|Address)}}Sanitizer:
+// CHECK: SUMMARY: {{.*}}Sanitizer:
index 69ac4b1..a4fbf27 100644 (file)
@@ -4,9 +4,6 @@
 // RUN: %env_lsan_opts="report_objects=1:use_stacks=0:use_registers=1" %run %t 2>&1
 // RUN: %env_lsan_opts="" %run %t 2>&1
 
-// Fixme: remove once test passes with hwasan
-// UNSUPPORTED: hwasan
-
 #include "sanitizer_common/print_address.h"
 #include <assert.h>
 #include <pthread.h>
@@ -80,4 +77,4 @@ int main() {
 // CHECK: Test alloc: [[ADDR:0x[0-9,a-f]+]]
 // CHECK: LeakSanitizer: detected memory leaks
 // CHECK: [[ADDR]] (1337 bytes)
-// CHECK: SUMMARY: {{(Leak|Address)}}Sanitizer:
+// CHECK: SUMMARY: {{.*}}Sanitizer:
index ffeffc4..0a423df 100644 (file)
@@ -4,9 +4,6 @@
 // RUN: %env_lsan_opts="report_objects=1:use_stacks=0:use_registers=1" %run %t 2>&1
 // RUN: %env_lsan_opts="" %run %t 2>&1
 
-// Fixme: remove once test passes with hwasan
-// UNSUPPORTED: hwasan
-
 // FIXME: Support more platforms.
 // REQUIRES: x86-target-arch && linux
 
@@ -60,4 +57,4 @@ int main() {
 // CHECK: Test alloc: [[ADDR:0x[0-9,a-f]+]]
 // CHECK: LeakSanitizer: detected memory leaks
 // CHECK: [[ADDR]] (1337 bytes)
-// CHECK: SUMMARY: {{(Leak|Address)}}Sanitizer:
+// CHECK: SUMMARY: {{.*}}Sanitizer:
index 015070f..f1ad7a1 100644 (file)
@@ -4,9 +4,6 @@
 // RUN: %env_lsan_opts="report_objects=1:use_registers=0:use_stacks=1" %run %t 2>&1
 // RUN: %env_lsan_opts="" %run %t 2>&1
 
-// Fixme: remove once test passes with hwasan
-// UNSUPPORTED: hwasan
-
 #include <assert.h>
 #include <pthread.h>
 #include <sched.h>
@@ -37,4 +34,4 @@ int main() {
 // CHECK: Test alloc: [[ADDR:0x[0-9,a-f]+]]
 // CHECK: LeakSanitizer: detected memory leaks
 // CHECK: [[ADDR]] (1337 bytes)
-// CHECK: SUMMARY: {{(Leak|Address)}}Sanitizer:
+// CHECK: SUMMARY: {{.*}}Sanitizer: