[compiler-rt] r180180 - tsan: fix crash when data race happens on out-of-bounds accesses.

Alexander Potapenko glider at google.com
Wed Apr 24 09:28:24 PDT 2013


Test?

On Wed, Apr 24, 2013 at 1:20 PM, Dmitry Vyukov <dvyukov at google.com> wrote:
> Author: dvyukov
> Date: Wed Apr 24 04:20:25 2013
> New Revision: 180180
>
> URL: http://llvm.org/viewvc/llvm-project?rev=180180&view=rev
> Log:
> tsan: fix crash when data race happens on out-of-bounds accesses.
>
> Modified:
>     compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc
>     compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc
>     compiler-rt/trunk/lib/tsan/rtl/tsan_sync.cc
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc?rev=180180&r1=180179&r2=180180&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc Wed Apr 24 04:20:25 2013
> @@ -149,6 +149,7 @@ void *user_realloc(ThreadState *thr, upt
>        return 0;
>      if (p) {
>        MBlock *b = user_mblock(thr, p);
> +      CHECK_NE(b, 0);
>        internal_memcpy(p2, p, min(b->Size(), sz));
>      }
>    }
> @@ -166,10 +167,11 @@ uptr user_alloc_usable_size(ThreadState
>  }
>
>  MBlock *user_mblock(ThreadState *thr, void *p) {
> -  CHECK_NE(p, (void*)0);
> +  CHECK_NE(p, 0);
>    Allocator *a = allocator();
>    void *b = a->GetBlockBegin(p);
> -  CHECK_NE(b, 0);
> +  if (b == 0)
> +    return 0;
>    return (MBlock*)a->GetMetaData(b);
>  }
>
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc?rev=180180&r1=180179&r2=180180&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc Wed Apr 24 04:20:25 2013
> @@ -313,8 +313,9 @@ void ScopedReport::AddLocation(uptr addr
>        AddThread(tctx);
>      return;
>    }
> -  if (allocator()->PointerIsMine((void*)addr)) {
> -    MBlock *b = user_mblock(0, (void*)addr);
> +  MBlock *b = 0;
> +  if (allocator()->PointerIsMine((void*)addr)
> +      && (b = user_mblock(0, (void*)addr))) {
>      ThreadContext *tctx = FindThreadByTidLocked(b->Tid());
>      void *mem = internal_alloc(MBlockReportLoc, sizeof(ReportLocation));
>      ReportLocation *loc = new(mem) ReportLocation();
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_sync.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_sync.cc?rev=180180&r1=180179&r2=180180&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_sync.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_sync.cc Wed Apr 24 04:20:25 2013
> @@ -82,6 +82,7 @@ SyncVar* SyncTab::GetAndLock(ThreadState
>    // the hashmap anyway.
>    if (PrimaryAllocator::PointerIsMine((void*)addr)) {
>      MBlock *b = user_mblock(thr, (void*)addr);
> +    CHECK_NE(b, 0);
>      MBlock::ScopedLock l(b);
>      SyncVar *res = 0;
>      for (res = b->ListHead(); res; res = res->next) {
> @@ -146,6 +147,7 @@ SyncVar* SyncTab::GetAndRemove(ThreadSta
>    }
>    if (PrimaryAllocator::PointerIsMine((void*)addr)) {
>      MBlock *b = user_mblock(thr, (void*)addr);
> +    CHECK_NE(b, 0);
>      SyncVar *res = 0;
>      {
>        MBlock::ScopedLock l(b);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



-- 
Alexander Potapenko
Software Engineer
Google Moscow



More information about the llvm-commits mailing list