summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@gmail.com>2014-03-20 05:56:00 +0000
committerCraig Topper <craig.topper@gmail.com>2014-03-20 05:56:00 +0000
commit38afbfdd7656375e4ac046f1a46a3f5ee0009bf8 (patch)
treea62672e562f422f2f29f794e879023f2c59aefa2 /llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
parent40b5ab8e5ba875f3664eba2a02cac31ba4382250 (diff)
downloadbcm5719-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.c7
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:
OpenPOWER on IntegriCloud