In the dynamic runtime on Mac OS, do not call internal_strdup() before __asan_init().
authorAlexander Potapenko <glider@google.com>
Fri, 26 Oct 2012 11:31:14 +0000 (11:31 +0000)
committerAlexander Potapenko <glider@google.com>
Fri, 26 Oct 2012 11:31:14 +0000 (11:31 +0000)
This may result in a crash at startup.
Fixes http://code.google.com/p/address-sanitizer/issues/detail?id=123.

llvm-svn: 166768

compiler-rt/lib/asan/asan_interceptors.cc

index d679863..48dfeb0 100644 (file)
@@ -382,6 +382,14 @@ INTERCEPTOR(char*, strcpy, char *to, const char *from) {  // NOLINT
 
 #if ASAN_INTERCEPT_STRDUP
 INTERCEPTOR(char*, strdup, const char *s) {
+#if MAC_INTERPOSE_FUNCTIONS
+  // FIXME: because internal_strdup() uses InternalAlloc(), which currently
+  // just calls malloc() on Mac, we can't use internal_strdup() with the
+  // dynamic runtime. We can remove the call to REAL(strdup) once InternalAlloc
+  // starts using mmap() instead.
+  // See also http://code.google.com/p/address-sanitizer/issues/detail?id=123.
+  if (!asan_inited) return REAL(strdup)(s);
+#endif
   if (!asan_inited) return internal_strdup(s);
   ENSURE_ASAN_INITED();
   if (flags()->replace_str) {