aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2015-11-19 21:51:55 +0000
committerReid Kleckner <rnk@google.com>2015-11-19 21:51:55 +0000
commitebee6129cdaeeaa3931bbd6d078a984c84d261f1 (patch)
treec809d38f61d7c8f1c42f4375680037559d0a845d /llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
parentae0140d6eca8a220cdc146a12eab2c3214aa4e97 (diff)
downloadllvm-ebee6129cdaeeaa3931bbd6d078a984c84d261f1.zip
llvm-ebee6129cdaeeaa3931bbd6d078a984c84d261f1.tar.gz
llvm-ebee6129cdaeeaa3931bbd6d078a984c84d261f1.tar.bz2
Fix UMRs in Mips disassembler on invalid instruction streams
The Insn and Size local variables were used without initialization. llvm-svn: 253607
Diffstat (limited to 'llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp')
-rw-r--r--llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp b/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
index f25df1e..f960183 100644
--- a/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
+++ b/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
@@ -867,6 +867,8 @@ DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
if (IsMicroMips) {
Result = readInstruction16(Bytes, Address, Size, Insn, IsBigEndian);
+ if (Result == MCDisassembler::Fail)
+ return MCDisassembler::Fail;
if (hasMips32r6()) {
DEBUG(dbgs() << "Trying MicroMipsR616 table (16-bit instructions):\n");
@@ -913,12 +915,17 @@ DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
Size = 4;
return Result;
}
+ // This is an invalid instruction. Let the disassembler move forward by the
+ // minimum instruction size.
+ Size = 2;
return MCDisassembler::Fail;
}
Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, false);
- if (Result == MCDisassembler::Fail)
+ if (Result == MCDisassembler::Fail) {
+ Size = 4;
return MCDisassembler::Fail;
+ }
if (hasCOP3()) {
DEBUG(dbgs() << "Trying COP3_ table (32-bit opcodes):\n");
@@ -979,6 +986,7 @@ DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
return Result;
}
+ Size = 4;
return MCDisassembler::Fail;
}