[PATCH] D19974: [sanitizer] Fix a crash when demangling Swift symbols

Kuba Brecka via llvm-commits llvm-commits at lists.llvm.org
Thu May 5 07:39:17 PDT 2016


kubabrecka created this revision.
kubabrecka added reviewers: zaks.anna, dvyukov, glider, samsonov, kcc.
kubabrecka added subscribers: llvm-commits, dcoughlin.
kubabrecka added a project: Sanitizers.
Herald added a subscriber: kubabrecka.

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.

http://reviews.llvm.org/D19974

Files:
  lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc

Index: lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
===================================================================
--- lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
+++ lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
@@ -63,6 +63,20 @@
   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 @@
     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 @@
 }
 
 Symbolizer *Symbolizer::PlatformInit() {
+  InitializeSwiftDemangler();
+
   IntrusiveList<SymbolizerTool> list;
   list.clear();
   ChooseSymbolizerTools(&list, &symbolizer_allocator_);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D19974.56285.patch
Type: text/x-patch
Size: 2079 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160505/721343d8/attachment.bin>


More information about the llvm-commits mailing list