Blob Blame History Raw
From: Heiko Carstens <heiko.carstens@de.ibm.com>
Subject: s390/disassembler: add missing end marker for e7 table
Patch-mainline: v4.15-rc1
Git-commit: 5c50538752af7968f53924b22dede8ed4ce4cb3b
References: bnc#1072915, LTC#162117

Description:  disassembler: missing end marker
Symptom:      Kernel crashes or emits wrong disassembly.
Problem:      The e7 opcode table does not have an end marker. Hence
              when trying to find an unknown e7 instruction the code
              will access memory behind the table until it finds
              something that matches the opcode, or the kernel
              crashes, whatever comes first.
              This affects not only the in-kernel disassembler but
              also uprobes and kprobes which refuse to set a probe on
              unknown instructions, and therefore search the opcode
              tables to figure out if instructions are known or not.
Solution:     Add missing end marker.
Reproduction: -

Upstream-Description:

              s390/disassembler: add missing end marker for e7 table

              The e7 opcode table does not have an end marker. Hence when trying to
              find an unknown e7 instruction the code will access memory behind the
              table until it finds something that matches the opcode, or the kernel
              crashes, whatever comes first.

              This affects not only the in-kernel disassembler but also uprobes and
              kprobes which refuse to set a probe on unknown instructions, and
              therefore search the opcode tables to figure out if instructions are
              known or not.

              Cc: <stable@vger.kernel.org> # v3.18+
              Fixes: 3585cb0280654 ("s390/disassembler: add vector instructions")
              Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
              Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>


Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Acked-by: Johannes Thumshirn <jthumshirn@suse.de>
---
 arch/s390/kernel/dis.c |    1 +
 1 file changed, 1 insertion(+)

--- a/arch/s390/kernel/dis.c
+++ b/arch/s390/kernel/dis.c
@@ -1548,6 +1548,7 @@ static struct s390_insn opcode_e7[] = {
 	{ "vfsq", 0xce, INSTR_VRR_VV000MM },
 	{ "vfs", 0xe2, INSTR_VRR_VVV00MM },
 	{ "vftci", 0x4a, INSTR_VRI_VVIMM },
+	{ "", 0, INSTR_INVALID }
 };
 
 static struct s390_insn opcode_eb[] = {