@@ -572,21 +572,33 @@ static uptr GetTopPc(StackTrace *stack) {
572572}
573573
574574namespace {
575- class InvalidFreeReport {
575+ class BaseReport {
576+ public:
577+ BaseReport (StackTrace *stack, bool fatal, uptr tagged_addr)
578+ : scoped_report(fatal),
579+ stack (stack),
580+ tagged_addr(tagged_addr),
581+ untagged_addr(UntagAddr(tagged_addr)),
582+ ptr_tag(GetTagFromPointer(tagged_addr)) {}
583+
584+ protected:
585+ ScopedReport scoped_report;
586+ StackTrace *stack;
587+ uptr tagged_addr;
588+ uptr untagged_addr;
589+ tag_t ptr_tag;
590+ };
591+
592+ class InvalidFreeReport : public BaseReport {
576593 public:
577594 InvalidFreeReport (StackTrace *stack, uptr tagged_addr)
578- : stack (stack), tagged_addr( tagged_addr) {}
595+ : BaseReport (stack, flags()->halt_on_error, tagged_addr) {}
579596 ~InvalidFreeReport ();
580597
581598 private:
582- StackTrace *stack;
583- uptr tagged_addr;
584599};
585600
586601InvalidFreeReport::~InvalidFreeReport () {
587- ScopedReport R (flags ()->halt_on_error );
588- uptr untagged_addr = UntagAddr (tagged_addr);
589- tag_t ptr_tag = GetTagFromPointer (tagged_addr);
590602 tag_t *tag_ptr = nullptr ;
591603 tag_t mem_tag = 0 ;
592604 if (MemIsApp (untagged_addr)) {
@@ -624,19 +636,16 @@ InvalidFreeReport::~InvalidFreeReport() {
624636 ReportErrorSummary (bug_type, stack);
625637}
626638
627- class TailOverwrittenReport {
639+ class TailOverwrittenReport : public BaseReport {
628640 public:
629641 explicit TailOverwrittenReport (StackTrace *stack, uptr tagged_addr,
630642 uptr orig_size, const u8 *expected)
631- : stack(stack),
632- tagged_addr(tagged_addr),
643+ : BaseReport(stack, flags()->halt_on_error, tagged_addr),
633644 orig_size(orig_size),
634645 expected(expected) {}
635646 ~TailOverwrittenReport ();
636647
637648 private:
638- StackTrace *stack;
639- uptr tagged_addr;
640649 uptr orig_size;
641650 const u8 *expected;
642651};
@@ -645,16 +654,13 @@ TailOverwrittenReport::~TailOverwrittenReport() {
645654 uptr tail_size = kShadowAlignment - (orig_size % kShadowAlignment );
646655 u8 actual_expected[kShadowAlignment ];
647656 internal_memcpy (actual_expected, expected, tail_size);
648- tag_t ptr_tag = GetTagFromPointer (tagged_addr);
649657 // Short granule is stashed in the last byte of the magic string. To avoid
650658 // confusion, make the expected magic string contain the short granule tag.
651659 if (orig_size % kShadowAlignment != 0 ) {
652660 actual_expected[tail_size - 1 ] = ptr_tag;
653661 }
654662
655- ScopedReport R (flags ()->halt_on_error );
656663 Decorator d;
657- uptr untagged_addr = UntagAddr (tagged_addr);
658664 Printf (" %s" , d.Error ());
659665 const char *bug_type = " allocation-tail-overwritten" ;
660666 Report (" ERROR: %s: %s; heap object [%p,%p) of size %zd\n " , SanitizerToolName,
@@ -712,35 +718,28 @@ TailOverwrittenReport::~TailOverwrittenReport() {
712718 ReportErrorSummary (bug_type, stack);
713719}
714720
715- class TagMismatchReport {
721+ class TagMismatchReport : public BaseReport {
716722 public:
717723 explicit TagMismatchReport (StackTrace *stack, uptr tagged_addr,
718724 uptr access_size, bool is_store, bool fatal,
719725 uptr *registers_frame)
720- : stack(stack),
721- tagged_addr(tagged_addr),
726+ : BaseReport(stack, fatal, tagged_addr),
722727 access_size(access_size),
723728 is_store(is_store),
724- fatal(fatal),
725729 registers_frame(registers_frame) {}
726730 ~TagMismatchReport ();
727731
728732 private:
729- StackTrace *stack;
730- uptr tagged_addr;
731733 uptr access_size;
732734 bool is_store;
733- bool fatal;
734735 uptr *registers_frame;
735736};
736737
737738TagMismatchReport::~TagMismatchReport () {
738- ScopedReport R (fatal);
739739 SavedStackAllocations current_stack_allocations (
740740 GetCurrentThread ()->stack_allocations ());
741741
742742 Decorator d;
743- uptr untagged_addr = UntagAddr (tagged_addr);
744743 // TODO: when possible, try to print heap-use-after-free, etc.
745744 const char *bug_type = " tag-mismatch" ;
746745 uptr pc = GetTopPc (stack);
@@ -754,7 +753,6 @@ TagMismatchReport::~TagMismatchReport() {
754753 __hwasan_test_shadow (reinterpret_cast <void *>(tagged_addr), access_size);
755754 CHECK_GE (offset, 0 );
756755 CHECK_LT (offset, static_cast <sptr>(access_size));
757- tag_t ptr_tag = GetTagFromPointer (tagged_addr);
758756 tag_t *tag_ptr =
759757 reinterpret_cast <tag_t *>(MemToShadow (untagged_addr + offset));
760758 tag_t mem_tag = *tag_ptr;
0 commit comments