[FIX] x86: pending retprobes unregistering
authorNikita Kalyazin <n.kalyazin@samsung.com>
Tue, 23 Apr 2013 06:58:05 +0000 (10:58 +0400)
committerNikita Kalyazin <n.kalyazin@samsung.com>
Tue, 23 Apr 2013 06:58:05 +0000 (10:58 +0400)
This is the fix to f8fa40b9f377164f117eeec47832b5b3351b4ec5 for x86.

What's been done here:
 - kprobe_opcode_t -> unsigned long for all address variables involved;
 - sp is set to &regs->sp, not regs->sp (which is upmost value on
   stack).

Tested on:
  - i386 Qemu, Buildroot rootfs, Linux kernel 3.8.2;
  - ARM Qemu, Buildroot rootfs, Linux kernel 3.8.2;
  - U1HD, GT-I8800_c210v30_cluster_20121002_1.

kprobe/arch/asm-x86/dbi_kprobes.c
kprobe/dbi_kprobes.c
kprobe/dbi_kprobes.h

index c8bd0d2..a9d5738 100644 (file)
@@ -1374,7 +1374,7 @@ void __arch_prepare_kretprobe (struct kretprobe *rp, struct pt_regs *regs)
                ri->rp = rp;
                ri->rp2 = NULL;
                ri->task = current;
-               ri->sp = (kprobe_opcode_t *)regs->EREG(sp);
+               ri->sp = &regs->EREG(sp);
 
                /* Replace the return addr with trampoline addr */
                if (rp->kp.tgid){
index 770e7c9..2502ef5 100644 (file)
@@ -823,9 +823,9 @@ static void inline rm_task_trampoline(struct task_struct *p, struct kretprobe_in
 
 static int dbi_disarm_krp_inst(struct kretprobe_instance *ri)
 {
-       kprobe_opcode_t *tramp = (kprobe_opcode_t *)&kretprobe_trampoline;
-       kprobe_opcode_t *sp = ri->sp;
-       kprobe_opcode_t *found = NULL;
+       unsigned long *tramp = &kretprobe_trampoline;
+       unsigned long *sp = ri->sp;
+       unsigned long *found = NULL;
        int retval = -ENOENT;
 
        if (!sp) {
@@ -834,12 +834,11 @@ static int dbi_disarm_krp_inst(struct kretprobe_instance *ri)
                printk("---> [%d] %s (%d/%d): pc = %08lx, ra = %08lx, tramp= %08lx (%08lx)\n",
                                task_cpu(ri->task),
                                ri->task->comm, ri->task->tgid, ri->task->pid,
-                               pc, (unsigned long)ri->ret_addr,
-                               (unsigned long)tramp,
-                               (unsigned long)(ri->rp ? ri->rp->kp.addr: NULL));
+                               pc, ri->ret_addr, tramp,
+                               ri->rp ? ri->rp->kp.addr: NULL);
 
                /* __switch_to retprobe handling */
-               if (pc == (unsigned long)tramp) {
+               if (pc == tramp) {
                        rm_task_trampoline(ri->task, ri);
                        return 0;
                }
@@ -848,7 +847,7 @@ static int dbi_disarm_krp_inst(struct kretprobe_instance *ri)
        }
 
        while (sp > ri->sp - RETPROBE_STACK_DEPTH) {
-               if ((unsigned long)*sp == (unsigned long)tramp) {
+               if (*sp == tramp) {
                        found = sp;
                        break;
                }
@@ -859,17 +858,16 @@ static int dbi_disarm_krp_inst(struct kretprobe_instance *ri)
                printk("---> [%d] %s (%d/%d): tramp (%08lx) found at %08lx (%08lx /%+d) - %p\n",
                                task_cpu(ri->task),
                                ri->task->comm, ri->task->tgid, ri->task->pid,
-                               (unsigned long)tramp,
-                               (unsigned long)found, (unsigned long)ri->sp, found - ri->sp,
+                               tramp, found, ri->sp, found - ri->sp,
                                ri->rp ? ri->rp->kp.addr: NULL);
-               *found = (unsigned long)ri->ret_addr;
+               *found = ri->ret_addr;
                retval = 0;
        } else {
                printk("---> [%d] %s (%d/%d): tramp (%08lx) NOT found at sp = %08lx - %p\n",
                                task_cpu(ri->task),
                                ri->task->comm, ri->task->tgid, ri->task->pid,
-                               (unsigned long)tramp,
-                               (unsigned long)ri->sp, ri->rp ? ri->rp->kp.addr: NULL);
+                               tramp,
+                               ri->sp, ri->rp ? ri->rp->kp.addr: NULL);
        }
 
        return retval;
index 01cf0ef..446ac31 100644 (file)
@@ -202,8 +202,8 @@ struct kretprobe_instance
        struct hlist_node uflist;
        struct hlist_node hlist;
        struct kretprobe *rp;
-       kprobe_opcode_t *ret_addr;
-       kprobe_opcode_t *sp;
+       unsigned long *ret_addr;
+       unsigned long *sp;
        struct kretprobe *rp2;
        struct task_struct *task;
 };