@@ -569,9 +569,20 @@ uptr GetTopPc(StackTrace *stack) {
569
569
: 0 ;
570
570
}
571
571
572
- void ReportInvalidFree (StackTrace *stack, uptr tagged_addr) {
573
- ScopedReport R (flags ()->halt_on_error );
572
+ namespace {
573
+ class InvalidFreeReport {
574
+ public:
575
+ InvalidFreeReport (StackTrace *stack, uptr tagged_addr)
576
+ : stack(stack), tagged_addr(tagged_addr) {}
577
+ ~InvalidFreeReport ();
574
578
579
+ private:
580
+ StackTrace *stack;
581
+ uptr tagged_addr;
582
+ };
583
+
584
+ InvalidFreeReport::~InvalidFreeReport () {
585
+ ScopedReport R (flags ()->halt_on_error );
575
586
uptr untagged_addr = UntagAddr (tagged_addr);
576
587
tag_t ptr_tag = GetTagFromPointer (tagged_addr);
577
588
tag_t *tag_ptr = nullptr ;
@@ -610,9 +621,31 @@ void ReportInvalidFree(StackTrace *stack, uptr tagged_addr) {
610
621
MaybePrintAndroidHelpUrl ();
611
622
ReportErrorSummary (bug_type, stack);
612
623
}
624
+ } // namespace
613
625
614
- void ReportTailOverwritten (StackTrace *stack, uptr tagged_addr, uptr orig_size,
615
- const u8 *expected) {
626
+ void ReportInvalidFree (StackTrace *stack, uptr tagged_addr) {
627
+ InvalidFreeReport R (stack, tagged_addr);
628
+ }
629
+
630
+ namespace {
631
+ class TailOverwrittenReport {
632
+ public:
633
+ explicit TailOverwrittenReport (StackTrace *stack, uptr tagged_addr,
634
+ uptr orig_size, const u8 *expected)
635
+ : stack(stack),
636
+ tagged_addr(tagged_addr),
637
+ orig_size(orig_size),
638
+ expected(expected) {}
639
+ ~TailOverwrittenReport ();
640
+
641
+ private:
642
+ StackTrace *stack;
643
+ uptr tagged_addr;
644
+ uptr orig_size;
645
+ const u8 *expected;
646
+ };
647
+
648
+ TailOverwrittenReport::~TailOverwrittenReport () {
616
649
uptr tail_size = kShadowAlignment - (orig_size % kShadowAlignment );
617
650
u8 actual_expected[kShadowAlignment ];
618
651
internal_memcpy (actual_expected, expected, tail_size);
@@ -682,9 +715,37 @@ void ReportTailOverwritten(StackTrace *stack, uptr tagged_addr, uptr orig_size,
682
715
MaybePrintAndroidHelpUrl ();
683
716
ReportErrorSummary (bug_type, stack);
684
717
}
718
+ } // namespace
685
719
686
- void ReportTagMismatch (StackTrace *stack, uptr tagged_addr, uptr access_size,
687
- bool is_store, bool fatal, uptr *registers_frame) {
720
+ void ReportTailOverwritten (StackTrace *stack, uptr tagged_addr, uptr orig_size,
721
+ const u8 *expected) {
722
+ TailOverwrittenReport R (stack, tagged_addr, orig_size, expected);
723
+ }
724
+
725
+ namespace {
726
+ class TagMismatchReport {
727
+ public:
728
+ explicit TagMismatchReport (StackTrace *stack, uptr tagged_addr,
729
+ uptr access_size, bool is_store, bool fatal,
730
+ uptr *registers_frame)
731
+ : stack(stack),
732
+ tagged_addr(tagged_addr),
733
+ access_size(access_size),
734
+ is_store(is_store),
735
+ fatal(fatal),
736
+ registers_frame(registers_frame) {}
737
+ ~TagMismatchReport ();
738
+
739
+ private:
740
+ StackTrace *stack;
741
+ uptr tagged_addr;
742
+ uptr access_size;
743
+ bool is_store;
744
+ bool fatal;
745
+ uptr *registers_frame;
746
+ };
747
+
748
+ TagMismatchReport::~TagMismatchReport () {
688
749
ScopedReport R (fatal);
689
750
SavedStackAllocations current_stack_allocations (
690
751
GetCurrentThread ()->stack_allocations ());
@@ -753,6 +814,13 @@ void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size,
753
814
MaybePrintAndroidHelpUrl ();
754
815
ReportErrorSummary (bug_type, stack);
755
816
}
817
+ } // namespace
818
+
819
+ void ReportTagMismatch (StackTrace *stack, uptr tagged_addr, uptr access_size,
820
+ bool is_store, bool fatal, uptr *registers_frame) {
821
+ TagMismatchReport R (stack, tagged_addr, access_size, is_store, fatal,
822
+ registers_frame);
823
+ }
756
824
757
825
// See the frame breakdown defined in __hwasan_tag_mismatch (from
758
826
// hwasan_tag_mismatch_{aarch64,riscv64}.S).
0 commit comments