diff options
| author | Anton Korobeynikov <anton@korobeynikov.info> | 2019-01-10 22:59:50 +0000 |
|---|---|---|
| committer | Anton Korobeynikov <anton@korobeynikov.info> | 2019-01-10 22:59:50 +0000 |
| commit | 0681d6bc90fe80a1c7534d5f4da96820b5da2037 (patch) | |
| tree | cd768395b0460381275d08d52e4f531a81e01389 /llvm/lib/Target/MSP430/Disassembler | |
| parent | 29ffb6d5580356dc4a7fa6201c051d2ec760193c (diff) | |
| download | bcm5719-llvm-0681d6bc90fe80a1c7534d5f4da96820b5da2037.tar.gz bcm5719-llvm-0681d6bc90fe80a1c7534d5f4da96820b5da2037.zip | |
[MSP430] Minor fixes/improvements for assembler/disassembler
* Teach AsmParser to recognize @rn in distination operand as 0(rn).
* Do not allow Disassembler decoding instructions that have size more
than a number of input bytes.
* Fix UB in MSP430MCCodeEmitter.
Patch by Kristina Bessonova!
Differential Revision: https://reviews.llvm.org/D56547
llvm-svn: 350903
Diffstat (limited to 'llvm/lib/Target/MSP430/Disassembler')
| -rw-r--r-- | llvm/lib/Target/MSP430/Disassembler/MSP430Disassembler.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/Target/MSP430/Disassembler/MSP430Disassembler.cpp b/llvm/lib/Target/MSP430/Disassembler/MSP430Disassembler.cpp index 2a66b4ed7f2..e5da130f9bb 100644 --- a/llvm/lib/Target/MSP430/Disassembler/MSP430Disassembler.cpp +++ b/llvm/lib/Target/MSP430/Disassembler/MSP430Disassembler.cpp @@ -249,6 +249,10 @@ DecodeStatus MSP430Disassembler::getInstructionI(MCInst &MI, uint64_t &Size, case amSymbolic: case amImmediate: case amAbsolute: + if (Bytes.size() < (Words + 1) * 2) { + Size = 2; + return DecodeStatus::Fail; + } Insn |= (uint64_t)support::endian::read16le(Bytes.data() + 2) << 16; ++Words; break; @@ -259,6 +263,10 @@ DecodeStatus MSP430Disassembler::getInstructionI(MCInst &MI, uint64_t &Size, case amIndexed: case amSymbolic: case amAbsolute: + if (Bytes.size() < (Words + 1) * 2) { + Size = 2; + return DecodeStatus::Fail; + } Insn |= (uint64_t)support::endian::read16le(Bytes.data() + Words * 2) << (Words * 16); ++Words; @@ -296,6 +304,10 @@ DecodeStatus MSP430Disassembler::getInstructionII(MCInst &MI, uint64_t &Size, case amSymbolic: case amImmediate: case amAbsolute: + if (Bytes.size() < (Words + 1) * 2) { + Size = 2; + return DecodeStatus::Fail; + } Insn |= (uint64_t)support::endian::read16le(Bytes.data() + 2) << 16; ++Words; break; |

