summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_tls_get_addr.cc
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-06-25 11:30:35 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-06-25 11:30:35 +0000
commit226906f2c3a6d4e997256bf8f6c562bfd2cb2184 (patch)
tree588568272ea1aa076ba45ead66d4bb63ce063c14 /lib/sanitizer_common/sanitizer_tls_get_addr.cc
parent4f598d5c528f370172f8364832d18fe2e35d6f84 (diff)
[msan] Fix false positive on dynamic tls.
Use existing DTLS code in sanitizer_tls_get_addr.{h,cc} to unpoison DTLS blocks both on allocation and deallocation. https://code.google.com/p/memory-sanitizer/issues/detail?id=44 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@211683 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_tls_get_addr.cc')
-rw-r--r--lib/sanitizer_common/sanitizer_tls_get_addr.cc10
1 files changed, 5 insertions, 5 deletions
diff --git a/lib/sanitizer_common/sanitizer_tls_get_addr.cc b/lib/sanitizer_common/sanitizer_tls_get_addr.cc
index 42d7d1a8d..993fdc658 100644
--- a/lib/sanitizer_common/sanitizer_tls_get_addr.cc
+++ b/lib/sanitizer_common/sanitizer_tls_get_addr.cc
@@ -78,14 +78,13 @@ void DTLS_Destroy() {
DTLS_Deallocate(dtls.dtv, s);
}
-void DTLS_on_tls_get_addr(void *arg_void, void *res) {
- if (!common_flags()->intercept_tls_get_addr) return;
+DTLS::DTV *DTLS_on_tls_get_addr(void *arg_void, void *res) {
+ if (!common_flags()->intercept_tls_get_addr) return 0;
TlsGetAddrParam *arg = reinterpret_cast<TlsGetAddrParam *>(arg_void);
uptr dso_id = arg->dso_id;
- if (dtls.dtv_size == kDestroyedThread) return;
+ if (dtls.dtv_size == kDestroyedThread) return 0;
DTLS_Resize(dso_id + 1);
- if (dtls.dtv[dso_id].beg)
- return;
+ if (dtls.dtv[dso_id].beg) return 0;
uptr tls_size = 0;
uptr tls_beg = reinterpret_cast<uptr>(res) - arg->offset;
VPrintf(2, "__tls_get_addr: %p {%p,%p} => %p; tls_beg: %p; sp: %p "
@@ -110,6 +109,7 @@ void DTLS_on_tls_get_addr(void *arg_void, void *res) {
}
dtls.dtv[dso_id].beg = tls_beg;
dtls.dtv[dso_id].size = tls_size;
+ return dtls.dtv + dso_id;
}
void DTLS_on_libc_memalign(void *ptr, uptr size) {