aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
diff options
context:
space:
mode:
authorDaniel Sanders <daniel.sanders@imgtec.com>2015-09-18 14:20:54 +0000
committerDaniel Sanders <daniel.sanders@imgtec.com>2015-09-18 14:20:54 +0000
commitdf19a5e6052386e11dedb9c1cc7140ae38098d8d (patch)
treeaeac2994c8507fe42ae9623600e411ada19cfc95 /llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
parentd90e2ebdf64f6b3c7038e323107ae84b44abd59d (diff)
downloadllvm-df19a5e6052386e11dedb9c1cc7140ae38098d8d.zip
llvm-df19a5e6052386e11dedb9c1cc7140ae38098d8d.tar.gz
llvm-df19a5e6052386e11dedb9c1cc7140ae38098d8d.tar.bz2
[mips][microMIPS] Fix an invalid read for lwm32 and reserved reglist values.
Summary: Some values of 'reglist' are reserved and cause the disassembler to read past the end of the Regs array. Treat lwm32's containing reserved values as invalid instructions. Reviewers: zoran.jovanovic Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D12959 llvm-svn: 247990
Diffstat (limited to 'llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp')
-rw-r--r--llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp b/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
index 4aa0afd..27eb399 100644
--- a/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
+++ b/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
@@ -1919,11 +1919,17 @@ static DecodeStatus DecodeRegListOperand(MCInst &Inst,
unsigned RegNum;
unsigned RegLst = fieldFromInstruction(Insn, 21, 5);
+
// Empty register lists are not allowed.
if (RegLst == 0)
return MCDisassembler::Fail;
RegNum = RegLst & 0xf;
+
+ // RegLst values 10-15, and 26-31 are reserved.
+ if (RegNum > 9)
+ return MCDisassembler::Fail;
+
for (unsigned i = 0; i < RegNum; i++)
Inst.addOperand(MCOperand::createReg(Regs[i]));