diff options
author | Alexander Richardson <arichardson.kde@gmail.com> | 2019-07-31 16:31:55 +0000 |
---|---|---|
committer | Alexander Richardson <arichardson.kde@gmail.com> | 2019-07-31 16:31:55 +0000 |
commit | a4ea27de9287744c5584e5f4eb755030661e665d (patch) | |
tree | 97088c8ef851da917bbabd936efbd0393e436df7 /compiler-rt/test/asan | |
parent | af44f18ad66b4f7bbe6a8f6ffa29637a4a5aeea1 (diff) | |
download | bcm5719-llvm-a4ea27de9287744c5584e5f4eb755030661e665d.tar.gz bcm5719-llvm-a4ea27de9287744c5584e5f4eb755030661e665d.zip |
[Sanitizer][ASAN][MSAN] Fix infinite recursion on FreeBSD
Summary:
MSAN was broken on FreeBSD by https://reviews.llvm.org/D55703: after this
change accesses to the key variable call __tls_get_addr, which is
intercepted. The interceptor then calls GetCurrentThread which calls
MsanTSDGet which again calls __tls_get_addr, etc...
Using the default implementation in the SANITIZER_FREEBSD case fixes MSAN
for me.
I then applied the same change to ASAN (introduced in https://reviews.llvm.org/D55596)
but that did not work yet. In the ASAN case, we get infinite recursion
again during initialization, this time because calling pthread_key_create() early on
results in infinite recursion. pthread_key_create() calls sysctlbyname()
which is intercepted but COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED returns
true, so the interceptor calls internal_sysctlbyname() which then ends up
calling the interceptor again. I fixed this issue by using dlsym() to get
the libc version of sysctlbyname() instead.
This fixes https://llvm.org/PR40761
Reviewers: vitalybuka, krytarowski, devnexen, dim, bsdjhb, #sanitizers, MaskRay
Reviewed By: MaskRay
Subscribers: MaskRay, emaste, kubamracek, jfb, #sanitizers, llvm-commits
Tags: #sanitizers, #llvm
Differential Revision: https://reviews.llvm.org/D65221
llvm-svn: 367442
Diffstat (limited to 'compiler-rt/test/asan')
-rw-r--r-- | compiler-rt/test/asan/TestCases/Posix/fread_fwrite.cc | 3 | ||||
-rw-r--r-- | compiler-rt/test/asan/TestCases/Posix/tsd_dtor_leak.cc | 2 |
2 files changed, 0 insertions, 5 deletions
diff --git a/compiler-rt/test/asan/TestCases/Posix/fread_fwrite.cc b/compiler-rt/test/asan/TestCases/Posix/fread_fwrite.cc index 64024886017..c0629260418 100644 --- a/compiler-rt/test/asan/TestCases/Posix/fread_fwrite.cc +++ b/compiler-rt/test/asan/TestCases/Posix/fread_fwrite.cc @@ -1,9 +1,6 @@ // RUN: %clangxx_asan -g %s -o %t // RUN: not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-FWRITE // RUN: not %run %t 1 2>&1 | FileCheck %s --check-prefix=CHECK-FREAD -// -// On FreeBSD stack overflow error instead -// XFAIL: freebsd #include <stdio.h> #include <stdlib.h> diff --git a/compiler-rt/test/asan/TestCases/Posix/tsd_dtor_leak.cc b/compiler-rt/test/asan/TestCases/Posix/tsd_dtor_leak.cc index 26109fe1a5f..860f3459e5a 100644 --- a/compiler-rt/test/asan/TestCases/Posix/tsd_dtor_leak.cc +++ b/compiler-rt/test/asan/TestCases/Posix/tsd_dtor_leak.cc @@ -3,8 +3,6 @@ // RUN: %clangxx_asan -O1 %s -pthread -o %t // RUN: %env_asan_opts=quarantine_size_mb=0 %run %t // XFAIL: x86_64-netbsd -// Assertion fails -// XFAIL: x86_64-freebsd #include <pthread.h> #include <stdio.h> #include <stdlib.h> |