diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2012-08-31 20:02:33 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2012-08-31 20:02:33 +0000 |
commit | 9adce675d5978dc8c584bafe724208bbab4ae72a (patch) | |
tree | 6751c1d0c458bf40700771aa2f7050063a6746e4 /lib/tsan/rtl | |
parent | 848531192777acecf79747dc7c1ffeedf5c1da9f (diff) | |
download | compiler-rt-9adce675d5978dc8c584bafe724208bbab4ae72a.tar.gz |
tsan: fix crash when users pass insane mutex addresses in dynamic annotations
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@163016 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl')
-rw-r--r-- | lib/tsan/rtl/tsan_rtl_mutex.cc | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/lib/tsan/rtl/tsan_rtl_mutex.cc b/lib/tsan/rtl/tsan_rtl_mutex.cc index a743924db..efbaf9c3b 100644 --- a/lib/tsan/rtl/tsan_rtl_mutex.cc +++ b/lib/tsan/rtl/tsan_rtl_mutex.cc @@ -16,6 +16,7 @@ #include "tsan_sync.h" #include "tsan_report.h" #include "tsan_symbolize.h" +#include "tsan_platform.h" namespace __tsan { @@ -25,7 +26,7 @@ void MutexCreate(ThreadState *thr, uptr pc, uptr addr, CHECK_GT(thr->in_rtl, 0); DPrintf("#%d: MutexCreate %zx\n", thr->tid, addr); StatInc(thr, StatMutexCreate); - if (!linker_init) + if (!linker_init && IsAppMem(addr)) MemoryWrite1Byte(thr, pc, addr); SyncVar *s = ctx->synctab.GetAndLock(thr, pc, addr, true); s->is_rw = rw; @@ -42,7 +43,8 @@ void MutexDestroy(ThreadState *thr, uptr pc, uptr addr) { SyncVar *s = ctx->synctab.GetAndRemove(thr, pc, addr); if (s == 0) return; - MemoryWrite1Byte(thr, pc, addr); + if (IsAppMem(addr)) + MemoryWrite1Byte(thr, pc, addr); if (flags()->report_destroy_locked && s->owner_tid != SyncVar::kInvalidTid && !s->is_broken) { @@ -64,7 +66,8 @@ void MutexDestroy(ThreadState *thr, uptr pc, uptr addr) { void MutexLock(ThreadState *thr, uptr pc, uptr addr) { CHECK_GT(thr->in_rtl, 0); DPrintf("#%d: MutexLock %zx\n", thr->tid, addr); - MemoryRead1Byte(thr, pc, addr); + if (IsAppMem(addr)) + MemoryRead1Byte(thr, pc, addr); thr->fast_state.IncrementEpoch(); TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeLock, addr); SyncVar *s = CTX()->synctab.GetAndLock(thr, pc, addr, true); @@ -94,7 +97,8 @@ void MutexLock(ThreadState *thr, uptr pc, uptr addr) { void MutexUnlock(ThreadState *thr, uptr pc, uptr addr) { CHECK_GT(thr->in_rtl, 0); DPrintf("#%d: MutexUnlock %zx\n", thr->tid, addr); - MemoryRead1Byte(thr, pc, addr); + if (IsAppMem(addr)) + MemoryRead1Byte(thr, pc, addr); thr->fast_state.IncrementEpoch(); TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeUnlock, addr); SyncVar *s = CTX()->synctab.GetAndLock(thr, pc, addr, true); @@ -128,7 +132,8 @@ void MutexReadLock(ThreadState *thr, uptr pc, uptr addr) { CHECK_GT(thr->in_rtl, 0); DPrintf("#%d: MutexReadLock %zx\n", thr->tid, addr); StatInc(thr, StatMutexReadLock); - MemoryRead1Byte(thr, pc, addr); + if (IsAppMem(addr)) + MemoryRead1Byte(thr, pc, addr); thr->fast_state.IncrementEpoch(); TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeRLock, addr); SyncVar *s = CTX()->synctab.GetAndLock(thr, pc, addr, false); @@ -145,7 +150,8 @@ void MutexReadUnlock(ThreadState *thr, uptr pc, uptr addr) { CHECK_GT(thr->in_rtl, 0); DPrintf("#%d: MutexReadUnlock %zx\n", thr->tid, addr); StatInc(thr, StatMutexReadUnlock); - MemoryRead1Byte(thr, pc, addr); + if (IsAppMem(addr)) + MemoryRead1Byte(thr, pc, addr); thr->fast_state.IncrementEpoch(); TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeRUnlock, addr); SyncVar *s = CTX()->synctab.GetAndLock(thr, pc, addr, true); @@ -162,7 +168,8 @@ void MutexReadUnlock(ThreadState *thr, uptr pc, uptr addr) { void MutexReadOrWriteUnlock(ThreadState *thr, uptr pc, uptr addr) { CHECK_GT(thr->in_rtl, 0); DPrintf("#%d: MutexReadOrWriteUnlock %zx\n", thr->tid, addr); - MemoryRead1Byte(thr, pc, addr); + if (IsAppMem(addr)) + MemoryRead1Byte(thr, pc, addr); SyncVar *s = CTX()->synctab.GetAndLock(thr, pc, addr, true); if (s->owner_tid == SyncVar::kInvalidTid) { // Seems to be read unlock. |