diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2018-11-09 21:54:03 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2018-11-09 21:54:03 +0000 |
commit | 771d6d37cad492a16538e6339d1cafeb80a4e7c0 (patch) | |
tree | 93ef4148ab48999731be8a4770604a011923f8aa | |
parent | 42ab39f1e8fb4a6c30c77988ed01e0cc663d1e00 (diff) | |
download | bcm5719-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.cc | 1 | ||||
-rw-r--r-- | compiler-rt/lib/hwasan/hwasan.h | 2 | ||||
-rw-r--r-- | compiler-rt/lib/hwasan/hwasan_linux.cc | 7 | ||||
-rw-r--r-- | compiler-rt/lib/hwasan/hwasan_report.cc | 51 | ||||
-rw-r--r-- | compiler-rt/lib/hwasan/hwasan_report.h | 2 | ||||
-rw-r--r-- | compiler-rt/test/hwasan/TestCases/abort-message-android.cc | 28 |
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 +} |