summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2018-03-12 21:46:55 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2018-03-12 21:46:55 +0000
commitc2e54761c954af30b291efcc39982cbda76d250f (patch)
treecc8c5d102f15689d329813e1341a422f6a5c1e96
parent8b342680bf62722e5099074e8bd23491c71d92b3 (diff)
downloadbcm5719-llvm-c2e54761c954af30b291efcc39982cbda76d250f.tar.gz
bcm5719-llvm-c2e54761c954af30b291efcc39982cbda76d250f.zip
[asan] poison_heap=0 should not disable __asan_handle_no_return.
Reviewers: kcc, alekseyshl, vitalybuka Subscribers: kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D44339 llvm-svn: 327337
-rw-r--r--compiler-rt/lib/asan/asan_poisoning.cc2
-rw-r--r--compiler-rt/lib/asan/asan_poisoning.h2
-rw-r--r--compiler-rt/test/asan/TestCases/handle_noreturn_bug.cc13
3 files changed, 15 insertions, 2 deletions
diff --git a/compiler-rt/lib/asan/asan_poisoning.cc b/compiler-rt/lib/asan/asan_poisoning.cc
index c3a82aa0049..62cbfe6f024 100644
--- a/compiler-rt/lib/asan/asan_poisoning.cc
+++ b/compiler-rt/lib/asan/asan_poisoning.cc
@@ -32,7 +32,7 @@ bool CanPoisonMemory() {
}
void PoisonShadow(uptr addr, uptr size, u8 value) {
- if (!CanPoisonMemory()) return;
+ if (value && !CanPoisonMemory()) return;
CHECK(AddrIsAlignedByGranularity(addr));
CHECK(AddrIsInMem(addr));
CHECK(AddrIsAlignedByGranularity(addr + size));
diff --git a/compiler-rt/lib/asan/asan_poisoning.h b/compiler-rt/lib/asan/asan_poisoning.h
index 1e00070bcf6..42cdc850ecc 100644
--- a/compiler-rt/lib/asan/asan_poisoning.h
+++ b/compiler-rt/lib/asan/asan_poisoning.h
@@ -38,7 +38,7 @@ void PoisonShadowPartialRightRedzone(uptr addr,
// performance-critical code with care.
ALWAYS_INLINE void FastPoisonShadow(uptr aligned_beg, uptr aligned_size,
u8 value) {
- DCHECK(CanPoisonMemory());
+ DCHECK(!value || CanPoisonMemory());
uptr shadow_beg = MEM_TO_SHADOW(aligned_beg);
uptr shadow_end = MEM_TO_SHADOW(
aligned_beg + aligned_size - SHADOW_GRANULARITY) + 1;
diff --git a/compiler-rt/test/asan/TestCases/handle_noreturn_bug.cc b/compiler-rt/test/asan/TestCases/handle_noreturn_bug.cc
new file mode 100644
index 00000000000..8c3c66a423d
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/handle_noreturn_bug.cc
@@ -0,0 +1,13 @@
+// Regression test: __asan_handle_no_return should unpoison stack even with poison_heap=0.
+// RUN: %clangxx_asan -O0 %s -o %t && \
+// RUN: %env_asan_opts=poison_heap=1 %run %t && \
+// RUN: %env_asan_opts=poison_heap=0 %run %t
+
+#include <sanitizer/asan_interface.h>
+
+int main(int argc, char **argv) {
+ int x[2];
+ int * volatile p = &x[0];
+ __asan_handle_no_return();
+ int volatile z = p[2];
+}
OpenPOWER on IntegriCloud