From b85b15d64acb303a56a79ad514d24d46fbe12612 Mon Sep 17 00:00:00 2001 From: Dan Liew Date: Mon, 17 Dec 2018 21:42:55 +0000 Subject: [PATCH] Don't trigger sanitizer initialization from `sysctlbyname` and `sysctl` interceptor. Summary: This fixes the `ThreadSanitizer-x86_64-iossim` testsuite which broke when r348770 (https://reviews.llvm.org/D55473) landed. The root cause of the problem is that early-on during the iOS simulator init process a call to `sysctlbyname` is issued. If the TSan initializer is triggered at this point it will eventually trigger a call to `__cxa_at_exit(...)`. This call then aborts because the library implementing this function is not yet had its initialization function called. rdar://problem/46696934 Reviewers: kubamracek, george.karpenkov, devnexen, vitalybuka, krytarowski Subscribers: #sanitizers, llvm-commits Differential Revision: https://reviews.llvm.org/D55711 llvm-svn: 349402 --- .../lib/sanitizer_common/sanitizer_common_interceptors.inc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc index 09fd17ef613e..37743a0fe619 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -7539,6 +7539,8 @@ INTERCEPTOR(int, fts_close, void *ftsp) { INTERCEPTOR(int, sysctl, int *name, unsigned int namelen, void *oldp, SIZE_T *oldlenp, void *newp, SIZE_T newlen) { void *ctx; + if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) + return internal_sysctl(name, namelen, oldp, oldlenp, newp, newlen); COMMON_INTERCEPTOR_ENTER(ctx, sysctl, name, namelen, oldp, oldlenp, newp, newlen); if (name) @@ -7561,6 +7563,8 @@ INTERCEPTOR(int, sysctl, int *name, unsigned int namelen, void *oldp, INTERCEPTOR(int, sysctlbyname, char *sname, void *oldp, SIZE_T *oldlenp, void *newp, SIZE_T newlen) { void *ctx; + if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) + return internal_sysctlbyname(sname, oldp, oldlenp, newp, newlen); COMMON_INTERCEPTOR_ENTER(ctx, sysctlbyname, sname, oldp, oldlenp, newp, newlen); if (sname)