diff options
author | Vitaly Buka <vitalybuka@google.com> | 2023-05-11 22:56:27 -0700 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2023-05-11 22:58:09 -0700 |
commit | 2394f091df0bba3f8c5362df1f7b6502cc837f66 (patch) | |
tree | 33cd25071c41e3bda05e4355d87c3c78f6da3e6c /compiler-rt | |
parent | 3826a74fc7ad589e268b267d9323d4d416c5f6e9 (diff) | |
download | llvm-2394f091df0bba3f8c5362df1f7b6502cc837f66.tar.gz |
[ASAN][LSAN] Ignore main or uninitialized thead in pthread_exit
Fix crash on CHECK in ThreadArgRetval::Finish().
Diffstat (limited to 'compiler-rt')
-rw-r--r-- | compiler-rt/lib/asan/asan_interceptors.cpp | 5 | ||||
-rw-r--r-- | compiler-rt/lib/lsan/lsan_interceptors.cpp | 4 |
2 files changed, 7 insertions, 2 deletions
diff --git a/compiler-rt/lib/asan/asan_interceptors.cpp b/compiler-rt/lib/asan/asan_interceptors.cpp index 7d658e527e17..b5767ead4a0f 100644 --- a/compiler-rt/lib/asan/asan_interceptors.cpp +++ b/compiler-rt/lib/asan/asan_interceptors.cpp @@ -23,6 +23,7 @@ #include "asan_suppressions.h" #include "asan_thread.h" #include "lsan/lsan_common.h" +#include "sanitizer_common/sanitizer_internal_defs.h" #include "sanitizer_common/sanitizer_libc.h" // There is no general interception at all on Fuchsia. @@ -263,7 +264,9 @@ INTERCEPTOR(int, pthread_detach, void *thread) { } INTERCEPTOR(int, pthread_exit, void *retval) { - asanThreadArgRetval().Finish(GetThreadSelf(), retval); + AsanThread *t = GetCurrentThread(); + if (t && t->tid() != kMainTid) + asanThreadArgRetval().Finish(GetThreadSelf(), retval); return REAL(pthread_exit)(retval); } diff --git a/compiler-rt/lib/lsan/lsan_interceptors.cpp b/compiler-rt/lib/lsan/lsan_interceptors.cpp index 2a35572edfec..b7268163bb23 100644 --- a/compiler-rt/lib/lsan/lsan_interceptors.cpp +++ b/compiler-rt/lib/lsan/lsan_interceptors.cpp @@ -489,7 +489,9 @@ INTERCEPTOR(int, pthread_detach, void *thread) { } INTERCEPTOR(int, pthread_exit, void *retval) { - GetThreadArgRetval().Finish(GetThreadSelf(), retval); + ThreadContextLsanBase *t = GetCurrentThread(); + if (t && t->tid != kMainTid) + GetThreadArgRetval().Finish(GetThreadSelf(), retval); return REAL(pthread_exit)(retval); } |