@@ -572,21 +572,33 @@ static uptr GetTopPc(StackTrace *stack) {
572
572
}
573
573
574
574
namespace {
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 {
576
593
public:
577
594
InvalidFreeReport (StackTrace *stack, uptr tagged_addr)
578
- : stack (stack), tagged_addr( tagged_addr) {}
595
+ : BaseReport (stack, flags()->halt_on_error, tagged_addr) {}
579
596
~InvalidFreeReport ();
580
597
581
598
private:
582
- StackTrace *stack;
583
- uptr tagged_addr;
584
599
};
585
600
586
601
InvalidFreeReport::~InvalidFreeReport () {
587
- ScopedReport R (flags ()->halt_on_error );
588
- uptr untagged_addr = UntagAddr (tagged_addr);
589
- tag_t ptr_tag = GetTagFromPointer (tagged_addr);
590
602
tag_t *tag_ptr = nullptr ;
591
603
tag_t mem_tag = 0 ;
592
604
if (MemIsApp (untagged_addr)) {
@@ -624,19 +636,16 @@ InvalidFreeReport::~InvalidFreeReport() {
624
636
ReportErrorSummary (bug_type, stack);
625
637
}
626
638
627
- class TailOverwrittenReport {
639
+ class TailOverwrittenReport : public BaseReport {
628
640
public:
629
641
explicit TailOverwrittenReport (StackTrace *stack, uptr tagged_addr,
630
642
uptr orig_size, const u8 *expected)
631
- : stack(stack),
632
- tagged_addr(tagged_addr),
643
+ : BaseReport(stack, flags()->halt_on_error, tagged_addr),
633
644
orig_size(orig_size),
634
645
expected(expected) {}
635
646
~TailOverwrittenReport ();
636
647
637
648
private:
638
- StackTrace *stack;
639
- uptr tagged_addr;
640
649
uptr orig_size;
641
650
const u8 *expected;
642
651
};
@@ -645,16 +654,13 @@ TailOverwrittenReport::~TailOverwrittenReport() {
645
654
uptr tail_size = kShadowAlignment - (orig_size % kShadowAlignment );
646
655
u8 actual_expected[kShadowAlignment ];
647
656
internal_memcpy (actual_expected, expected, tail_size);
648
- tag_t ptr_tag = GetTagFromPointer (tagged_addr);
649
657
// Short granule is stashed in the last byte of the magic string. To avoid
650
658
// confusion, make the expected magic string contain the short granule tag.
651
659
if (orig_size % kShadowAlignment != 0 ) {
652
660
actual_expected[tail_size - 1 ] = ptr_tag;
653
661
}
654
662
655
- ScopedReport R (flags ()->halt_on_error );
656
663
Decorator d;
657
- uptr untagged_addr = UntagAddr (tagged_addr);
658
664
Printf (" %s" , d.Error ());
659
665
const char *bug_type = " allocation-tail-overwritten" ;
660
666
Report (" ERROR: %s: %s; heap object [%p,%p) of size %zd\n " , SanitizerToolName,
@@ -712,35 +718,28 @@ TailOverwrittenReport::~TailOverwrittenReport() {
712
718
ReportErrorSummary (bug_type, stack);
713
719
}
714
720
715
- class TagMismatchReport {
721
+ class TagMismatchReport : public BaseReport {
716
722
public:
717
723
explicit TagMismatchReport (StackTrace *stack, uptr tagged_addr,
718
724
uptr access_size, bool is_store, bool fatal,
719
725
uptr *registers_frame)
720
- : stack(stack),
721
- tagged_addr(tagged_addr),
726
+ : BaseReport(stack, fatal, tagged_addr),
722
727
access_size(access_size),
723
728
is_store(is_store),
724
- fatal(fatal),
725
729
registers_frame(registers_frame) {}
726
730
~TagMismatchReport ();
727
731
728
732
private:
729
- StackTrace *stack;
730
- uptr tagged_addr;
731
733
uptr access_size;
732
734
bool is_store;
733
- bool fatal;
734
735
uptr *registers_frame;
735
736
};
736
737
737
738
TagMismatchReport::~TagMismatchReport () {
738
- ScopedReport R (fatal);
739
739
SavedStackAllocations current_stack_allocations (
740
740
GetCurrentThread ()->stack_allocations ());
741
741
742
742
Decorator d;
743
- uptr untagged_addr = UntagAddr (tagged_addr);
744
743
// TODO: when possible, try to print heap-use-after-free, etc.
745
744
const char *bug_type = " tag-mismatch" ;
746
745
uptr pc = GetTopPc (stack);
@@ -754,7 +753,6 @@ TagMismatchReport::~TagMismatchReport() {
754
753
__hwasan_test_shadow (reinterpret_cast <void *>(tagged_addr), access_size);
755
754
CHECK_GE (offset, 0 );
756
755
CHECK_LT (offset, static_cast <sptr>(access_size));
757
- tag_t ptr_tag = GetTagFromPointer (tagged_addr);
758
756
tag_t *tag_ptr =
759
757
reinterpret_cast <tag_t *>(MemToShadow (untagged_addr + offset));
760
758
tag_t mem_tag = *tag_ptr;
0 commit comments