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

Alexey Samsonov samsonov at google.com
Tue Oct 15 05:09:54 PDT 2013


On Tue, Oct 15, 2013 at 3:34 PM, Dmitry Vyukov <dvyukov at google.com> wrote:

> 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)))) {
>

I think this expression is hard to understand. Also, shouldn't we have
TemplateMatch(lib->templ, real_name) here?


>          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;
>  }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131015/f1bf292f/attachment.html>


More information about the llvm-commits mailing list