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

Dmitry Vyukov dvyukov at google.com
Tue Oct 15 05:12:20 PDT 2013


On Tue, Oct 15, 2013 at 4:09 PM, Alexey Samsonov <samsonov at google.com> wrote:
>
> 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?

Why we should have it 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



More information about the llvm-commits mailing list