@@ -569,9 +569,20 @@ uptr GetTopPc(StackTrace *stack) {
569569 : 0 ;
570570}
571571
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 ();
574578
579+ private:
580+ StackTrace *stack;
581+ uptr tagged_addr;
582+ };
583+
584+ InvalidFreeReport::~InvalidFreeReport () {
585+ ScopedReport R (flags ()->halt_on_error );
575586 uptr untagged_addr = UntagAddr (tagged_addr);
576587 tag_t ptr_tag = GetTagFromPointer (tagged_addr);
577588 tag_t *tag_ptr = nullptr ;
@@ -610,9 +621,31 @@ void ReportInvalidFree(StackTrace *stack, uptr tagged_addr) {
610621 MaybePrintAndroidHelpUrl ();
611622 ReportErrorSummary (bug_type, stack);
612623}
624+ } // namespace
613625
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 () {
616649 uptr tail_size = kShadowAlignment - (orig_size % kShadowAlignment );
617650 u8 actual_expected[kShadowAlignment ];
618651 internal_memcpy (actual_expected, expected, tail_size);
@@ -682,9 +715,37 @@ void ReportTailOverwritten(StackTrace *stack, uptr tagged_addr, uptr orig_size,
682715 MaybePrintAndroidHelpUrl ();
683716 ReportErrorSummary (bug_type, stack);
684717}
718+ } // namespace
685719
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 () {
688749 ScopedReport R (fatal);
689750 SavedStackAllocations current_stack_allocations (
690751 GetCurrentThread ()->stack_allocations ());
@@ -753,6 +814,13 @@ void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size,
753814 MaybePrintAndroidHelpUrl ();
754815 ReportErrorSummary (bug_type, stack);
755816}
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+ }
756824
757825// See the frame breakdown defined in __hwasan_tag_mismatch (from
758826// hwasan_tag_mismatch_{aarch64,riscv64}.S).
0 commit comments