diff options
| author | Fangrui Song <maskray@google.com> | 2020-01-13 10:34:10 -0800 |
|---|---|---|
| committer | Fangrui Song <maskray@google.com> | 2020-01-13 10:42:21 -0800 |
| commit | 64a93afc3c630c39e5c583e4f67aef5821d635b6 (patch) | |
| tree | c5a68796c0cabeea934fddd88306e4c9d19a8234 /llvm/lib/Target/X86 | |
| parent | 484a7472f1aa6906f2b66dc33bcf69cc8d5b9f29 (diff) | |
| download | bcm5719-llvm-64a93afc3c630c39e5c583e4f67aef5821d635b6.tar.gz bcm5719-llvm-64a93afc3c630c39e5c583e4f67aef5821d635b6.zip | |
[X86][Disassembler] Fix a bug when disassembling an empty string
readPrefixes() assumes insn->bytes is non-empty. The code path is not
exercised in llvm-mc because llvm-mc does not feed empty input to
MCDisassembler::getInstruction().
This bug is uncovered by a5994c789a2982a770254ae1607b5b4cb641f73c.
An empty string did not crash before because the deleted regionReader()
allowed UINT64_C(-1) as insn->readerCursor.
Bytes.size() <= Address -> R->Base
0 <= UINT64_C(-1) - UINT32_C(-1)
Diffstat (limited to 'llvm/lib/Target/X86')
| -rw-r--r-- | llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp index 8d0c12e9464..34ea95d418b 100644 --- a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp +++ b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp @@ -203,6 +203,8 @@ static bool isREX(struct InternalInstruction *insn, uint8_t prefix) { // Consumes all of an instruction's prefix bytes, and marks the // instruction as having them. Also sets the instruction's default operand, // address, and other relevant data sizes to report operands correctly. +// +// insn must not be empty. static int readPrefixes(struct InternalInstruction *insn) { bool isPrefix = true; uint8_t byte = 0; @@ -1707,7 +1709,7 @@ MCDisassembler::DecodeStatus X86GenericDisassembler::getInstruction( Insn.readerCursor = Address; Insn.mode = fMode; - if (readPrefixes(&Insn) || readOpcode(&Insn) || + if (Bytes.empty() || readPrefixes(&Insn) || readOpcode(&Insn) || getInstructionID(&Insn, MII.get()) || Insn.instructionID == 0 || readOperands(&Insn)) { Size = Insn.readerCursor - Address; |

