Patch "kprobes/x86: Return correct length in __copy_instruction()" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
kprobes/x86: Return correct length in __copy_instruction()
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kprobes-x86-return-correct-length-in-__copy_instruction.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
c80e5c0c23ce2282476fdc64c4b5e3d3a40723fdMon Sep 17 00:00:00 2001
From: Eugene Shatokhin <[email protected]>
Date: Tue, 17 Mar 2015 19:09:18 +0900
Subject: kprobes/x86: Return correct length in __copy_instruction()
From: Eugene Shatokhin <[email protected]>
commit c80e5c0c23ce2282476fdc64c4b5e3d3a40723fd upstream.
On x86-64, __copy_instruction() always returns 0 (error) if the instruction uses %rip-relative addressing. This is because kernel_insn_init() is called the second time for 'insn' instance in such cases and sets all its fields to 0.
Because of this, trying to place a kprobe on such instruction will fail, register_kprobe() will return -EINVAL.
This patch fixes the problem.
--- arch/x86/kernel/kprobes/core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
arch/x86/kernel/kprobes/core.c +5 -2
@@ -326,13 +326,16 @@ int __kprobes __copy_instruction(u8 *des {struct insn insn;kprobe_opcode_t buf[MAX_INSN_SIZE ]; +int length;kernel_insn_init (&insn, (void *)recover_probed_instruction (buf, (unsigned long )src));insn_get_length (&insn); + length = insn.length; +/* Another subsystem puts a breakpoint, failed to recover */ if (insn.opcode.bytes[0 ] ==BREAKPOINT_INSTRUCTION )return 0 ; -memcpy (dest, insn.kaddr, insn.length); +memcpy (dest, insn.kaddr, length);#ifdef CONFIG_X86_64 if (insn_rip_relative (&insn)) {
@@ -362,7 +365,7 @@ int __kprobes __copy_instruction(u8 *des *(s32 *) disp = (s32) newdisp; }#endif -return insn.length; +return length; }static int __kprobes arch_copy_kprobe (struct kprobe *p)
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/kprobes-x86-return-correct-length-in-__copy_instruction.patch