Skip to content

Commit 9094b3b

Browse files
committed
[NFC][hwasan] Extract BaseReport (#66682)
1 parent 170a25a commit 9094b3b

File tree

1 file changed

+23
-25
lines changed

1 file changed

+23
-25
lines changed

compiler-rt/lib/hwasan/hwasan_report.cpp

+23-25
Original file line numberDiff line numberDiff line change
@@ -572,21 +572,33 @@ static uptr GetTopPc(StackTrace *stack) {
572572
}
573573

574574
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 {
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

586601
InvalidFreeReport::~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

737738
TagMismatchReport::~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

Comments
 (0)