summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2018-11-09 21:54:03 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2018-11-09 21:54:03 +0000
commit771d6d37cad492a16538e6339d1cafeb80a4e7c0 (patch)
tree93ef4148ab48999731be8a4770604a011923f8aa
parent42ab39f1e8fb4a6c30c77988ed01e0cc663d1e00 (diff)
downloadbcm5719-llvm-771d6d37cad492a16538e6339d1cafeb80a4e7c0.tar.gz
bcm5719-llvm-771d6d37cad492a16538e6339d1cafeb80a4e7c0.zip
[hwasan] Add entire report to abort message on Android.
Summary: When reporting a fatal error, collect and add the entire report text to android_set_abort_message so that it can be found in the tombstone. Reviewers: kcc, vitalybuka Subscribers: srhines, kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D54284 llvm-svn: 346557
-rw-r--r--compiler-rt/lib/hwasan/hwasan.cc1
-rw-r--r--compiler-rt/lib/hwasan/hwasan.h2
-rw-r--r--compiler-rt/lib/hwasan/hwasan_linux.cc7
-rw-r--r--compiler-rt/lib/hwasan/hwasan_report.cc51
-rw-r--r--compiler-rt/lib/hwasan/hwasan_report.h2
-rw-r--r--compiler-rt/test/hwasan/TestCases/abort-message-android.cc28
6 files changed, 82 insertions, 9 deletions
diff --git a/compiler-rt/lib/hwasan/hwasan.cc b/compiler-rt/lib/hwasan/hwasan.cc
index 8f0daeeb147..7a96bb26684 100644
--- a/compiler-rt/lib/hwasan/hwasan.cc
+++ b/compiler-rt/lib/hwasan/hwasan.cc
@@ -292,6 +292,7 @@ void __hwasan_init() {
MadviseShadow();
+ SetPrintfAndReportCallback(AppendToErrorMessageBuffer);
// This may call libc -> needs initialized shadow.
AndroidLogInit();
diff --git a/compiler-rt/lib/hwasan/hwasan.h b/compiler-rt/lib/hwasan/hwasan.h
index daf65eefd3a..b33ce83836e 100644
--- a/compiler-rt/lib/hwasan/hwasan.h
+++ b/compiler-rt/lib/hwasan/hwasan.h
@@ -152,6 +152,8 @@ void HwasanOnDeadlySignal(int signo, void *info, void *context);
void UpdateMemoryUsage();
+void AppendToErrorMessageBuffer(const char *buffer);
+
} // namespace __hwasan
#define HWASAN_MALLOC_HOOK(ptr, size) \
diff --git a/compiler-rt/lib/hwasan/hwasan_linux.cc b/compiler-rt/lib/hwasan/hwasan_linux.cc
index eef332fe9f1..750d11d9e63 100644
--- a/compiler-rt/lib/hwasan/hwasan_linux.cc
+++ b/compiler-rt/lib/hwasan/hwasan_linux.cc
@@ -358,11 +358,10 @@ static bool HwasanOnSIGTRAP(int signo, siginfo_t *info, ucontext_t *uc) {
GetStackTrace(stack, kStackTraceMax, StackTrace::GetNextInstructionPc(sig.pc),
sig.bp, uc, common_flags()->fast_unwind_on_fatal);
- ReportTagMismatch(stack, ai.addr, ai.size, ai.is_store);
-
++hwasan_report_count;
- if (flags()->halt_on_error || !ai.recover)
- Die();
+
+ bool fatal = flags()->halt_on_error || !ai.recover;
+ ReportTagMismatch(stack, ai.addr, ai.size, ai.is_store, fatal);
#if defined(__aarch64__)
uc->uc_mcontext.pc += 4;
diff --git a/compiler-rt/lib/hwasan/hwasan_report.cc b/compiler-rt/lib/hwasan/hwasan_report.cc
index ef2d57a7bcf..c4085e9632b 100644
--- a/compiler-rt/lib/hwasan/hwasan_report.cc
+++ b/compiler-rt/lib/hwasan/hwasan_report.cc
@@ -30,6 +30,49 @@ using namespace __sanitizer;
namespace __hwasan {
+class ScopedReport {
+ public:
+ ScopedReport(bool fatal = false) : error_message_(1), fatal(fatal) {
+ BlockingMutexLock lock(&error_message_lock_);
+ error_message_ptr_ = fatal ? &error_message_ : nullptr;
+ }
+
+ ~ScopedReport() {
+ BlockingMutexLock lock(&error_message_lock_);
+ if (fatal) {
+ SetAbortMessage(error_message_.data());
+ Die();
+ }
+ error_message_ptr_ = nullptr;
+ }
+
+ static void MaybeAppendToErrorMessage(const char *msg) {
+ BlockingMutexLock lock(&error_message_lock_);
+ if (!error_message_ptr_)
+ return;
+ uptr len = internal_strlen(msg);
+ uptr old_size = error_message_ptr_->size();
+ error_message_ptr_->resize(old_size + len);
+ // overwrite old trailing '\0', keep new trailing '\0' untouched.
+ internal_memcpy(&(*error_message_ptr_)[old_size - 1], msg, len);
+ }
+ private:
+ ScopedErrorReportLock error_report_lock_;
+ InternalMmapVector<char> error_message_;
+ bool fatal;
+
+ static InternalMmapVector<char> *error_message_ptr_;
+ static BlockingMutex error_message_lock_;
+};
+
+InternalMmapVector<char> *ScopedReport::error_message_ptr_;
+BlockingMutex ScopedReport::error_message_lock_;
+
+// If there is an active ScopedReport, append to its error message.
+void AppendToErrorMessageBuffer(const char *buffer) {
+ ScopedReport::MaybeAppendToErrorMessage(buffer);
+}
+
static StackTrace GetStackTraceFromId(u32 id) {
CHECK(id);
StackTrace res = StackDepotGet(id);
@@ -255,7 +298,8 @@ static void PrintTagsAroundAddr(tag_t *tag_ptr) {
}
void ReportInvalidFree(StackTrace *stack, uptr tagged_addr) {
- ScopedErrorReportLock l;
+ ScopedReport R(flags()->halt_on_error);
+
uptr untagged_addr = UntagAddr(tagged_addr);
tag_t ptr_tag = GetTagFromPointer(tagged_addr);
tag_t *tag_ptr = reinterpret_cast<tag_t*>(MemToShadow(untagged_addr));
@@ -277,12 +321,11 @@ void ReportInvalidFree(StackTrace *stack, uptr tagged_addr) {
PrintTagsAroundAddr(tag_ptr);
ReportErrorSummary(bug_type, stack);
- Die();
}
void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size,
- bool is_store) {
- ScopedErrorReportLock l;
+ bool is_store, bool fatal) {
+ ScopedReport R(fatal);
SavedStackAllocations current_stack_allocations(
GetCurrentThread()->stack_allocations());
diff --git a/compiler-rt/lib/hwasan/hwasan_report.h b/compiler-rt/lib/hwasan/hwasan_report.h
index 85d00038386..62b242c09a7 100644
--- a/compiler-rt/lib/hwasan/hwasan_report.h
+++ b/compiler-rt/lib/hwasan/hwasan_report.h
@@ -23,7 +23,7 @@ namespace __hwasan {
void ReportStats();
void ReportTagMismatch(StackTrace *stack, uptr addr, uptr access_size,
- bool is_store);
+ bool is_store, bool fatal);
void ReportInvalidFree(StackTrace *stack, uptr addr);
void ReportAtExitStatistics();
diff --git a/compiler-rt/test/hwasan/TestCases/abort-message-android.cc b/compiler-rt/test/hwasan/TestCases/abort-message-android.cc
new file mode 100644
index 00000000000..f89b929d454
--- /dev/null
+++ b/compiler-rt/test/hwasan/TestCases/abort-message-android.cc
@@ -0,0 +1,28 @@
+// RUN: %clangxx_hwasan -DERR=1 %s -o %t && not %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx_hwasan -DERR=2 %s -o %t && not %run %t 2>&1 | FileCheck %s
+// REQUIRES: android
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <sanitizer/hwasan_interface.h>
+
+__attribute__((no_sanitize("hwaddress")))
+extern "C" void android_set_abort_message(const char *msg) {
+ fprintf(stderr, "== abort message start\n%s\n== abort message end\n", msg);
+}
+
+int main() {
+ __hwasan_enable_allocator_tagging();
+ char *volatile p = (char *)malloc(16);
+ if (ERR==1) {
+ p[16] = 1;
+ } else {
+ free(p);
+ free(p);
+ }
+ // CHECK: ERROR: HWAddressSanitizer:
+ // CHECK: == abort message start
+ // CHECK: ERROR: HWAddressSanitizer:
+ // CHECK: == abort message end
+}
OpenPOWER on IntegriCloud