[compiler-rt] r268716 - [sanitizer] Fix a crash when demangling Swift symbols

Kuba Brecka via llvm-commits llvm-commits at lists.llvm.org
Fri May 6 01:54:58 PDT 2016


Author: kuba.brecka
Date: Fri May  6 03:54:58 2016
New Revision: 268716

URL: http://llvm.org/viewvc/llvm-project?rev=268716&view=rev
Log:
[sanitizer] Fix a crash when demangling Swift symbols

To invoke the Swift demangler, we use dlsym to locate swift_demangle. However, dlsym malloc's storage and stores it in thread-local storage. Since allocations from the symbolizer are done with the system allocator (at least in TSan, interceptors are skipped when inside the symbolizer), we will crash when we try to deallocate later using the sanitizer allocator again.

To fix this, let's just not call dlsym from the demangler, and call it during initialization.

Differential Revision: http://reviews.llvm.org/D19974


Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc?rev=268716&r1=268715&r2=268716&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc Fri May  6 03:54:58 2016
@@ -63,6 +63,20 @@ const char *DemangleCXXABI(const char *n
   return name;
 }
 
+// As of now, there are no headers for the Swift runtime. Once they are
+// present, we will weakly link since we do not require Swift runtime to be
+// linked.
+typedef char *(*swift_demangle_ft)(const char *mangledName,
+                                   size_t mangledNameLength, char *outputBuffer,
+                                   size_t *outputBufferSize, uint32_t flags);
+static swift_demangle_ft swift_demangle_f;
+
+// This must not happen lazily, because dlsym uses thread-local storage, which
+// is not a good thing to do during symbolication.
+static void InitializeSwiftDemangler() {
+  swift_demangle_f = (swift_demangle_ft)dlsym(RTLD_DEFAULT, "swift_demangle");
+}
+
 // Attempts to demangle a Swift name. The demangler will return nullptr
 /// if a non-Swift name is passed in.
 const char *DemangleSwift(const char *name) {
@@ -72,16 +86,6 @@ const char *DemangleSwift(const char *na
     return nullptr;
   }
 
-  // As of now, there are no headers for the Swift runtime. Once they are
-  // present, we will weakly link since we do not require Swift runtime to be
-  // linked.
-  typedef char *(*swift_demangle_ft)(const char *mangledName,
-                                     size_t mangledNameLength,
-                                     char *outputBuffer,
-                                     size_t *outputBufferSize,
-                                     uint32_t flags);
-  swift_demangle_ft swift_demangle_f =
-    (swift_demangle_ft) dlsym(RTLD_DEFAULT, "swift_demangle");
   if (swift_demangle_f)
     return swift_demangle_f(name, internal_strlen(name), 0, 0, 0);
 
@@ -479,6 +483,8 @@ static void ChooseSymbolizerTools(Intrus
 }
 
 Symbolizer *Symbolizer::PlatformInit() {
+  InitializeSwiftDemangler();
+
   IntrusiveList<SymbolizerTool> list;
   list.clear();
   ChooseSymbolizerTools(&list, &symbolizer_allocator_);




More information about the llvm-commits mailing list