Correctly disassemble truncated asm.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 6 Jan 2011 16:48:42 +0000 (16:48 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 6 Jan 2011 16:48:42 +0000 (16:48 +0000)
Patch by Richard Simth.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122962 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
test/MC/Disassembler/X86/truncated-input.txt [new file with mode: 0644]
tools/llvm-mc/Disassembler.cpp

index 1fd66853f75e8514824a81f527e4dd9c8291b712..0af510c4cec74f1048652a7a64e25ad5795244b4 100644 (file)
@@ -511,7 +511,8 @@ static int getIDWithAttrMask(uint16_t* instructionID,
                                     insn->opcode);
   
   if (hasModRMExtension) {
-    readModRM(insn);
+    if (readModRM(insn))
+      return -1;
     
     *instructionID = decode(insn->opcodeType,
                             instructionClass,
@@ -860,7 +861,8 @@ static int readModRM(struct InternalInstruction* insn) {
   if (insn->consumedModRM)
     return 0;
   
-  consumeByte(insn, &insn->modRM);
+  if (consumeByte(insn, &insn->modRM))
+    return -1;
   insn->consumedModRM = TRUE;
   
   mod     = modFromModRM(insn->modRM);
diff --git a/test/MC/Disassembler/X86/truncated-input.txt b/test/MC/Disassembler/X86/truncated-input.txt
new file mode 100644 (file)
index 0000000..34cf038
--- /dev/null
@@ -0,0 +1,4 @@
+# RUN: llvm-mc --disassemble %s -triple=x86_64-apple-darwin9 |& FileCheck %s
+
+# CHECK: warning
+0x00
index e5c31ca598eb9659b263b4690b48503735847f78..c29d82a2cb38426368d14ab057068d70bdb09a7c 100644 (file)
@@ -44,7 +44,7 @@ public:
   uint64_t getExtent() const { return Bytes.size(); }
 
   int readByte(uint64_t Addr, uint8_t *Byte) const {
-    if (Addr > getExtent())
+    if (Addr >= getExtent())
       return -1;
     *Byte = Bytes[Addr].first;
     return 0;