[llvm-commits] [compiler-rt] r163016 - /compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc
Dmitry Vyukov
dvyukov at google.com
Fri Aug 31 13:02:33 PDT 2012
Author: dvyukov
Date: Fri Aug 31 15:02:33 2012
New Revision: 163016
URL: http://llvm.org/viewvc/llvm-project?rev=163016&view=rev
Log:
tsan: fix crash when users pass insane mutex addresses in dynamic annotations
Modified:
compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc?rev=163016&r1=163015&r2=163016&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc Fri Aug 31 15:02:33 2012
@@ -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 @@
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 @@
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 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 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 @@
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 @@
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 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.
More information about the llvm-commits
mailing list