[compiler-rt] r192688 - tsan: resolve symlinks for called_from_lib suppressions

Dmitry Vyukov dvyukov at google.com
Tue Oct 15 04:34:59 PDT 2013


Author: dvyukov
Date: Tue Oct 15 06:34:59 2013
New Revision: 192688

URL: http://llvm.org/viewvc/llvm-project?rev=192688&view=rev
Log:
tsan: resolve symlinks for called_from_lib suppressions


Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_libignore.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_libignore.h
    compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_libignore.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_libignore.cc?rev=192688&r1=192687&r2=192688&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_libignore.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_libignore.cc Tue Oct 15 06:34:59 2013
@@ -38,7 +38,12 @@ void LibIgnore::Init(const SuppressionCo
   }
 }
 
-void LibIgnore::OnLibraryLoaded() {
+void LibIgnore::OnLibraryLoaded(const char *name) {
+  const char *real_name = 0;
+  InternalScopedBuffer<char> buf(4096);
+  if (name != 0 && internal_readlink(name, buf.data(), buf.size() - 1) > 0)
+    real_name = buf.data();
+
   BlockingMutexLock lock(&mutex_);
   MemoryMappingLayout proc_maps(/*cache_enabled*/false);
   InternalScopedBuffer<char> fn(4096);
@@ -48,8 +53,14 @@ void LibIgnore::OnLibraryLoaded() {
     proc_maps.Reset();
     uptr b, e, off, prot;
     while (proc_maps.Next(&b, &e, &off, fn.data(), fn.size(), &prot)) {
-      if ((prot & MemoryMappingLayout::kProtectionExecute) != 0 &&
-          TemplateMatch(lib->templ, fn.data())) {
+      bool symlink = false;
+      if (((prot & MemoryMappingLayout::kProtectionExecute) != 0) &&
+          (TemplateMatch(lib->templ, fn.data()) ||
+          // Resolve symlinks.
+          (real_name != 0 && real_name[0] != 0 &&
+          TemplateMatch(lib->templ, name) &&
+          internal_strcmp(real_name, fn.data()) == 0 &&
+          (symlink = true)))) {
         if (loaded) {
           Report("%s: called_from_lib suppression '%s' is matched against"
                  " 2 libraries: '%s' and '%s'\n",
@@ -60,6 +71,8 @@ void LibIgnore::OnLibraryLoaded() {
         if (!lib->loaded) {
           lib->loaded = true;
           lib->name = internal_strdup(fn.data());
+          if (symlink)
+            lib->real_name = internal_strdup(real_name);
           const uptr idx = atomic_load(&loaded_count_, memory_order_relaxed);
           code_ranges_[idx].begin = b;
           code_ranges_[idx].end = e;
@@ -77,7 +90,7 @@ void LibIgnore::OnLibraryLoaded() {
 }
 
 void LibIgnore::OnLibraryUnloaded() {
-  OnLibraryLoaded();
+  OnLibraryLoaded(0);
 }
 
 }  // namespace __sanitizer

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_libignore.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_libignore.h?rev=192688&r1=192687&r2=192688&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_libignore.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_libignore.h Tue Oct 15 06:34:59 2013
@@ -33,7 +33,7 @@ class LibIgnore {
   void Init(const SuppressionContext &supp);
 
   // Must be called after a new dynamic library is loaded.
-  void OnLibraryLoaded();
+  void OnLibraryLoaded(const char *name);
 
   // Must be called after a dynamic library is unloaded.
   void OnLibraryUnloaded();
@@ -45,6 +45,7 @@ class LibIgnore {
   struct Lib {
     char *templ;
     char *name;
+    char *real_name;  // target of symlink
     bool loaded;
   };
 

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=192688&r1=192687&r2=192688&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Tue Oct 15 06:34:59 2013
@@ -136,7 +136,7 @@ static LibIgnore *libignore() {
 
 void InitializeLibIgnore() {
   libignore()->Init(*GetSuppressionContext());
-  libignore()->OnLibraryLoaded();
+  libignore()->OnLibraryLoaded(0);
 }
 
 }  // namespace __tsan
@@ -263,7 +263,7 @@ TSAN_INTERCEPTOR(void*, dlopen, const ch
   thr->in_rtl = 0;
   void *res = REAL(dlopen)(filename, flag);
   thr->in_rtl = 1;
-  libignore()->OnLibraryLoaded();
+  libignore()->OnLibraryLoaded(filename);
   return res;
 }
 





More information about the llvm-commits mailing list