From a16075cfc9a6fbbc933cf00d0e407a11eb210918 Mon Sep 17 00:00:00 2001 From: Anna Zaks Date: Thu, 25 Jun 2015 23:36:21 +0000 Subject: [PATCH] [asan] Do not unset DYLD_ROOT_PATH before calling atos on Darwin We were unsetting DYLD_ROOT_PATH before calling atos on Darwin in order to address it not working for symbolicating 32 bit binaries. (atos essentiall tries to respawn as a 32 bit binary and it's disallowed to respawn if DYLD_ROOT_PATH is set ... ) However, processes rely on having DYLD_ROOT_PATH set under certain conditions, so this is not the right fix. In particular, this always crashes when running ASanified process under the debugger in Xcode with iOS simulator, which is a very important workflow for us to support. This patch reverts the unsetting of the DYLD_ROOT_PATH. The correct fix to the misbehavior on 32-bit binaries should happen inside atos. http://reviews.llvm.org/D10722 llvm-svn: 240724 --- .../sanitizer_symbolizer_mac.cc | 3 --- .../Darwin/atos-symbolizer-dyld-root-path.cc | 26 +++++++++++++++++++ .../asan/TestCases/Darwin/atos-symbolizer.cc | 4 --- 3 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cc diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc index c2397ef98a54..9a64192b0353 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc @@ -53,9 +53,6 @@ class AtosSymbolizerProcess : public SymbolizerProcess { } void ExecuteWithDefaultArgs(const char *path_to_binary) const override { - // The `atos` binary has some issues with DYLD_ROOT_PATH on i386. - unsetenv("DYLD_ROOT_PATH"); - char pid_str[16]; internal_snprintf(pid_str, sizeof(pid_str), "%d", parent_pid_); if (GetMacosVersion() == MACOS_VERSION_MAVERICKS) { diff --git a/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cc b/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cc new file mode 100644 index 000000000000..f6070188d8e5 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cc @@ -0,0 +1,26 @@ +// Check that when having a DYLD_ROOT_PATH set, the symbolizer still works. +// RUN: env DYLD_ROOT_PATH="/" ASAN_OPTIONS=$ASAN_OPTIONS:verbosity=2 ASAN_SYMBOLIZER_PATH=$(which atos) \ +// RUN: not %run %t 2>&1 | FileCheck %s +// +// Due to a bug in atos, this only works on x86_64. +// REQUIRES: x86_64 + +#include +#include +int main(int argc, char **argv) { + char *x = (char*)malloc(10 * sizeof(char)); + memset(x, 0, 10); + int res = x[argc]; + free(x); + free(x + argc - 1); // BOOM + // CHECK: AddressSanitizer: attempting double-free{{.*}}in thread T0 + // CHECK: Using atos at user-specified path: + // CHECK: #0 0x{{.*}} in {{.*}}free + // CHECK: #1 0x{{.*}} in main {{.*}}atos-symbolizer.cc:[[@LINE-4]] + // CHECK: freed by thread T0 here: + // CHECK: #0 0x{{.*}} in {{.*}}free + // CHECK: #1 0x{{.*}} in main {{.*}}atos-symbolizer.cc:[[@LINE-8]] + // CHECK: allocated by thread T0 here: + // CHECK: atos-symbolizer.cc:[[@LINE-13]] + return res; +} diff --git a/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer.cc b/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer.cc index 8da842238052..03cadf92d16a 100644 --- a/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer.cc +++ b/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer.cc @@ -3,10 +3,6 @@ // RUN: %clangxx_asan -O0 %s -o %t // RUN: env ASAN_OPTIONS=$ASAN_OPTIONS:verbosity=2 ASAN_SYMBOLIZER_PATH=$(which atos) not %run %t 2>&1 | FileCheck %s -// Check that when having a DYLD_ROOT_PATH set, the symbolizer still works. -// RUN: env DYLD_ROOT_PATH="/" ASAN_OPTIONS=$ASAN_OPTIONS:verbosity=2 ASAN_SYMBOLIZER_PATH=$(which atos) \ -// RUN: not %run %t 2>&1 | FileCheck %s - #include #include int main(int argc, char **argv) {