diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2013-09-20 06:54:14 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2013-09-20 06:54:14 +0000 |
commit | eb0be61dee155f501bb249287b17d364fedf3507 (patch) | |
tree | e21a335b7bea3f1618ff2a655f4c5818356b5003 /lib/tsan/rtl/tsan_interceptors.cc | |
parent | ff90a95c26198e9e794e186365a62511439e0ca0 (diff) | |
download | compiler-rt-eb0be61dee155f501bb249287b17d364fedf3507.tar.gz compiler-rt-eb0be61dee155f501bb249287b17d364fedf3507.tar.bz2 compiler-rt-eb0be61dee155f501bb249287b17d364fedf3507.tar.xz |
tsan: handle memory read/write in syscalls
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@191074 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl/tsan_interceptors.cc')
-rw-r--r-- | lib/tsan/rtl/tsan_interceptors.cc | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc index 0e8cc174..e53e5cf3 100644 --- a/lib/tsan/rtl/tsan_interceptors.cc +++ b/lib/tsan/rtl/tsan_interceptors.cc @@ -1846,11 +1846,21 @@ struct TsanInterceptorContext { #define COMMON_INTERCEPTOR_BLOCK_REAL(name) BLOCK_REAL(name) #include "sanitizer_common/sanitizer_common_interceptors.inc" -// FIXME: Implement these with MemoryAccessRange(). +static void syscall_access_range(uptr pc, uptr p, uptr s, bool write) { + ThreadState *thr = cur_thread(); + if (thr->in_rtl == 0) + Initialize(thr); + thr->in_rtl++; + MemoryAccessRange(thr, pc, p, s, write); + thr->in_rtl--; + if (thr->in_rtl == 0) + ProcessPendingSignals(thr); +} + #define COMMON_SYSCALL_PRE_READ_RANGE(p, s) \ - do { } while (false) + syscall_access_range(GET_CALLER_PC(), (uptr)(p), (uptr)(s), false) #define COMMON_SYSCALL_PRE_WRITE_RANGE(p, s) \ - do { } while (false) + syscall_access_range(GET_CALLER_PC(), (uptr)(p), (uptr)(s), true) #define COMMON_SYSCALL_POST_READ_RANGE(p, s) \ do { } while (false) #define COMMON_SYSCALL_POST_WRITE_RANGE(p, s) \ |