diff options
Diffstat (limited to 'disassembler/disassembler_arm64.cc')
| -rw-r--r-- | disassembler/disassembler_arm64.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/disassembler/disassembler_arm64.cc b/disassembler/disassembler_arm64.cc index 5f8871470d..6a9afe5740 100644 --- a/disassembler/disassembler_arm64.cc +++ b/disassembler/disassembler_arm64.cc @@ -63,9 +63,17 @@ void CustomDisassembler::VisitLoadLiteral(const vixl::Instruction* instr) { return; } + // Get address of literal. Bail if not within expected buffer range to + // avoid trying to fetch invalid literals (we can encounter this when + // interpreting raw data as instructions). void* data_address = instr->LiteralAddress<void*>(); - vixl::Instr op = instr->Mask(vixl::LoadLiteralMask); + if (data_address < base_address_ || data_address >= end_address_) { + AppendToOutput(" (?)"); + return; + } + // Output information on literal. + vixl::Instr op = instr->Mask(vixl::LoadLiteralMask); switch (op) { case vixl::LDR_w_lit: case vixl::LDR_x_lit: |