ia64: kprobes: Fix to pass correct trampoline address to the handler
authorMasami Hiramatsu <mhiramat@kernel.org>
Tue, 26 Apr 2022 14:26:24 +0000 (23:26 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 1 May 2022 15:00:37 +0000 (17:00 +0200)
commit a7fe2378454cf46cd5e2776d05e72bbe8f0a468c upstream.

The following commit:

   Commit e792ff804f49 ("ia64: kprobes: Use generic kretprobe trampoline handler")

Passed the wrong trampoline address to __kretprobe_trampoline_handler(): it
passes the descriptor address instead of function entry address.

Pass the right parameter.

Also use correct symbol dereference function to get the function address
from 'kretprobe_trampoline' - an IA64 special.

Link: https://lkml.kernel.org/r/163163042696.489837.12551102356265354730.stgit@devnote2
Fixes: e792ff804f49 ("ia64: kprobes: Use generic kretprobe trampoline handler")
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: X86 ML <x86@kernel.org>
Cc: Daniel Xu <dxu@dxuuu.xyz>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Abhishek Sagar <sagar.abhishek@gmail.com>
Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: Paul McKenney <paulmck@kernel.org>
Cc: stable@vger.kernel.org
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/ia64/kernel/kprobes.c

index aa41bd5cf9b771ecda27e50a8acf7c3f0cf500fb..7fc0806bbdc91f8b927b6375eb62037a20e24a64 100644 (file)
@@ -424,7 +424,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
        struct hlist_node *tmp;
        unsigned long flags, orig_ret_address = 0;
        unsigned long trampoline_address =
-               ((struct fnptr *)kretprobe_trampoline)->ip;
+               (unsigned long)dereference_function_descriptor(kretprobe_trampoline);
 
        INIT_HLIST_HEAD(&empty_rp);
        kretprobe_hash_lock(current, &head, &flags);
@@ -500,7 +500,7 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
        ri->ret_addr = (kprobe_opcode_t *)regs->b0;
 
        /* Replace the return addr with trampoline addr */
-       regs->b0 = ((struct fnptr *)kretprobe_trampoline)->ip;
+       regs->b0 = (unsigned long)dereference_function_descriptor(kretprobe_trampoline);
 }
 
 /* Check the instruction in the slot is break */
@@ -1030,14 +1030,14 @@ static struct kprobe trampoline_p = {
 int __init arch_init_kprobes(void)
 {
        trampoline_p.addr =
-               (kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip;
+               dereference_function_descriptor(kretprobe_trampoline);
        return register_kprobe(&trampoline_p);
 }
 
 int __kprobes arch_trampoline_kprobe(struct kprobe *p)
 {
        if (p->addr ==
-               (kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip)
+               dereference_function_descriptor(kretprobe_trampoline))
                return 1;
 
        return 0;