summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2017-10-25 16:54:12 +0000
committerReid Kleckner <rnk@google.com>2017-10-25 16:54:12 +0000
commitd8ac58ba4113c97e6a33e063e03bd907cb82ea47 (patch)
tree3c09e55f370083d44cf1769e61fae6dc76707f0e
parent6f634ed9c3f52ef54e4e294b2f8765dd1bdce9f2 (diff)
[asan] Don't print rows of shadow bytes outside shadow memory
Summary: They might not be mapped on some platforms such as Win64. In particular, this happens if the user address is null. There will not be any shadow memory 5*16 bytes before the user address. This happens on Win64 in the error_report_callback.cc test case. It's not clear why this isn't a problem on Linux as well. Fixes PR35058 Reviewers: vitalybuka Subscribers: kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D39260 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@316589 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/asan/asan_errors.cc9
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/asan/asan_errors.cc b/lib/asan/asan_errors.cc
index d42a86850..dee666d54 100644
--- a/lib/asan/asan_errors.cc
+++ b/lib/asan/asan_errors.cc
@@ -422,9 +422,14 @@ static void PrintShadowMemoryForAddress(uptr addr) {
InternalScopedString str(4096 * 8);
str.append("Shadow bytes around the buggy address:\n");
for (int i = -5; i <= 5; i++) {
+ uptr row_shadow_addr = aligned_shadow + i * n_bytes_per_row;
+ // Skip rows that would be outside the shadow range. This can happen when
+ // the user address is near the bottom, top, or shadow gap of the address
+ // space.
+ if (!AddrIsInShadow(row_shadow_addr)) continue;
const char *prefix = (i == 0) ? "=>" : " ";
- PrintShadowBytes(&str, prefix, (u8 *)(aligned_shadow + i * n_bytes_per_row),
- (u8 *)shadow_addr, n_bytes_per_row);
+ PrintShadowBytes(&str, prefix, (u8 *)row_shadow_addr, (u8 *)shadow_addr,
+ n_bytes_per_row);
}
if (flags()->print_legend) PrintLegend(&str);
Printf("%s", str.data());