diff options
author | Daniel Sanders <daniel.sanders@imgtec.com> | 2015-09-18 14:20:54 +0000 |
---|---|---|
committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2015-09-18 14:20:54 +0000 |
commit | df19a5e6052386e11dedb9c1cc7140ae38098d8d (patch) | |
tree | aeac2994c8507fe42ae9623600e411ada19cfc95 /llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp | |
parent | d90e2ebdf64f6b3c7038e323107ae84b44abd59d (diff) | |
download | llvm-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.cpp | 6 |
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])); |