[PATCH] [asan] Do not unset DYLD_ROOT_PATH before calling atos on Darwin

Anna Zaks zaks.anna at gmail.com
Wed Jun 24 18:07:10 PDT 2015


Hi samsonov, kubabrecka,

We were unsetting DYLD_ROOT_PATH before calling atos on Darwin in order to address it not working for symbolicating 32 bit binaries. (atos essentially 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

Files:
  lib/sanitizer_common/sanitizer_symbolizer_mac.cc
  test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cc
  test/asan/TestCases/Darwin/atos-symbolizer.cc

Index: lib/sanitizer_common/sanitizer_symbolizer_mac.cc
===================================================================
--- lib/sanitizer_common/sanitizer_symbolizer_mac.cc
+++ lib/sanitizer_common/sanitizer_symbolizer_mac.cc
@@ -53,9 +53,6 @@
   }
 
   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) {
Index: test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cc
===================================================================
--- /dev/null
+++ 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 <stdlib.h>
+#include <string.h>
+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;
+}
Index: test/asan/TestCases/Darwin/atos-symbolizer.cc
===================================================================
--- test/asan/TestCases/Darwin/atos-symbolizer.cc
+++ 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 <stdlib.h>
 #include <string.h>
 int main(int argc, char **argv) {

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10722.28431.patch
Type: text/x-patch
Size: 2521 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150625/a6d9bff9/attachment.bin>


More information about the llvm-commits mailing list