Patch "kprobes/x86: Return correct length in __copy_instruction()" has been added to the 4.0-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 4.0-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-4.0 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 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
arch/x86/kernel/kprobes/core.c +6 -3
@@ -354,6 +354,7 @@ int __copy_instruction(u8 *dest, u8 *src {struct insn insn;kprobe_opcode_t buf[MAX_INSN_SIZE ]; +int length;unsigned long recovered_insn =recover_probed_instruction (buf, (unsigned long )src);
@@ -361,16 +362,18 @@ int __copy_instruction(u8 *dest, u8 *srcreturn 0 ;kernel_insn_init (&insn, (void *)recovered_insn,MAX_INSN_SIZE );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)) {s64 newdisp;u8 *disp; -kernel_insn_init (&insn, dest, insn.length); +kernel_insn_init (&insn, dest, length);insn_get_displacement (&insn);/* * The copied instruction uses the %rip-relative addressing
@@ -394,7 +397,7 @@ int __copy_instruction(u8 *dest, u8 *src *(s32 *) disp = (s32) newdisp; }#endif -return insn.length; +return length; }static int arch_copy_kprobe (struct kprobe *p)
Patches currently in stable-queue which might be from [email protected] are
queue-4.0/kprobes-x86-return-correct-length-in-__copy_instruction.patch