s390/kprobes: fix instruction copy for out of line execution
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Fri, 28 Nov 2014 11:36:48 +0000 (12:36 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 1 Dec 2014 10:07:44 +0000 (11:07 +0100)
When we generate the instruction for out of line execution the length
of the to be copied instruction was evaluated from a not initialized
memory location.
Therefore we ended up with a random (2, 4 or 6) number of bytes being
copied instead of taking the real instruction length into account.
This works surprisingly well most of the time, but still not always.

Reported-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/kprobes.c

index ee0396755430b085ab800fb5f0c5a09fbda71989..1e4c710dfb9233dafa10a07fcb769b6028758a66 100644 (file)
@@ -74,7 +74,7 @@ static void copy_instruction(struct kprobe *p)
                ftrace_generate_nop_insn((struct ftrace_insn *)p->ainsn.insn);
                p->ainsn.is_ftrace_insn = 1;
        } else
-               memcpy(p->ainsn.insn, p->addr, insn_length(p->opcode >> 8));
+               memcpy(p->ainsn.insn, p->addr, insn_length(*p->addr >> 8));
        p->opcode = p->ainsn.insn[0];
        if (!probe_is_insn_relative_long(p->ainsn.insn))
                return;