From caa7d737edbacdaa02ce1596f26425164e38be0b Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Fri, 13 Sep 2013 14:14:10 +0200 Subject: [PATCH] s390/kprobes: allow kprobes only on known instructions Since we have an in-kernel disassembler we can make sure that there won't be any kprobes set on random data. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky --- arch/s390/include/asm/dis.h | 6 ++++++ arch/s390/kernel/dis.c | 2 +- arch/s390/kernel/kprobes.c | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/arch/s390/include/asm/dis.h b/arch/s390/include/asm/dis.h index 4d0dffc68221..04a83f5773cd 100644 --- a/arch/s390/include/asm/dis.h +++ b/arch/s390/include/asm/dis.h @@ -42,5 +42,11 @@ static inline int insn_length(unsigned char code) void show_code(struct pt_regs *regs); void print_fn_code(unsigned char *code, unsigned long len); int insn_to_mnemonic(unsigned char *instruction, char *buf, unsigned int len); +struct s390_insn *find_insn(unsigned char *code); + +static inline int is_known_insn(unsigned char *code) +{ + return !!find_insn(code); +} #endif /* __ASM_S390_DIS_H__ */ diff --git a/arch/s390/kernel/dis.c b/arch/s390/kernel/dis.c index ce554f3ec445..993efe6a887c 100644 --- a/arch/s390/kernel/dis.c +++ b/arch/s390/kernel/dis.c @@ -1586,7 +1586,7 @@ static unsigned int extract_operand(unsigned char *code, return val; } -static struct s390_insn *find_insn(unsigned char *code) +struct s390_insn *find_insn(unsigned char *code) { unsigned char opfrag = code[1]; unsigned char opmask; diff --git a/arch/s390/kernel/kprobes.c b/arch/s390/kernel/kprobes.c index c52fdf290301..59a9c35c4598 100644 --- a/arch/s390/kernel/kprobes.c +++ b/arch/s390/kernel/kprobes.c @@ -60,6 +60,8 @@ struct kprobe_insn_cache kprobe_dmainsn_slots = { static int __kprobes is_prohibited_opcode(kprobe_opcode_t *insn) { + if (!is_known_insn((unsigned char *)insn)) + return -EINVAL; switch (insn[0] >> 8) { case 0x0c: /* bassm */ case 0x0b: /* bsm */ -- 2.39.5