diff options
author | Craig Topper <craig.topper@gmail.com> | 2014-03-20 05:56:00 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2014-03-20 05:56:00 +0000 |
commit | 38afbfdd7656375e4ac046f1a46a3f5ee0009bf8 (patch) | |
tree | a62672e562f422f2f29f794e879023f2c59aefa2 /llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c | |
parent | 40b5ab8e5ba875f3664eba2a02cac31ba4382250 (diff) | |
download | bcm5719-llvm-38afbfdd7656375e4ac046f1a46a3f5ee0009bf8.tar.gz bcm5719-llvm-38afbfdd7656375e4ac046f1a46a3f5ee0009bf8.zip |
[X86] Check return value of readSIB in disassembler so errors propagate. In particular this makes a too short instruction with a missing SIB byte fail.
llvm-svn: 204305
Diffstat (limited to 'llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c')
-rw-r--r-- | llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c index 482ce652dde..0801c969d34 100644 --- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c +++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c @@ -1092,7 +1092,6 @@ static int readSIB(struct InternalInstruction* insn) { case 2: dbgprintf(insn, "SIB-based addressing doesn't work in 16-bit mode"); return -1; - break; case 4: sibIndexBase = SIB_INDEX_EAX; sibBaseBase = SIB_BASE_EAX; @@ -1314,8 +1313,7 @@ static int readModRM(struct InternalInstruction* insn) { case 0xc: /* in case REXW.b is set */ insn->eaBase = (insn->addressSize == 4 ? EA_BASE_sib : EA_BASE_sib64); - readSIB(insn); - if (readDisplacement(insn)) + if (readSIB(insn) || readDisplacement(insn)) return -1; break; case 0x5: @@ -1339,8 +1337,7 @@ static int readModRM(struct InternalInstruction* insn) { case 0x4: case 0xc: /* in case REXW.b is set */ insn->eaBase = EA_BASE_sib; - readSIB(insn); - if (readDisplacement(insn)) + if (readSIB(insn) || readDisplacement(insn)) return -1; break; default: |