[Sanitizer][ASAN][MSAN] Fix infinite recursion on FreeBSD
authorAlexander Richardson <arichardson.kde@gmail.com>
Wed, 31 Jul 2019 16:31:55 +0000 (16:31 +0000)
committerAlexander Richardson <arichardson.kde@gmail.com>
Wed, 31 Jul 2019 16:31:55 +0000 (16:31 +0000)
commita4ea27de9287744c5584e5f4eb755030661e665d
tree97088c8ef851da917bbabd936efbd0393e436df7
parentaf44f18ad66b4f7bbe6a8f6ffa29637a4a5aeea1
[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
compiler-rt/lib/asan/asan_posix.cc
compiler-rt/lib/msan/msan_linux.cc
compiler-rt/lib/sanitizer_common/sanitizer_linux.cc
compiler-rt/test/asan/TestCases/Posix/fread_fwrite.cc
compiler-rt/test/asan/TestCases/Posix/tsd_dtor_leak.cc
compiler-rt/test/msan/tzset.cc