diff options
author | Dmitry Kovalenko <d.kovalenko@samsung.com> | 2013-08-01 13:46:01 +0400 |
---|---|---|
committer | Dmitry Kovalenko <d.kovalenko@samsung.com> | 2013-08-01 13:46:01 +0400 |
commit | 1f6771ade41edd7d2f7c9547672805d24b463f92 (patch) | |
tree | 514385c72f28fc34daf1ec1d4c8983f49cb40ecc /kprobe | |
parent | 69ce6b4c789bf0ee7cf526b354a3ac1d0f6a6524 (diff) | |
download | swap-modules-1f6771ade41edd7d2f7c9547672805d24b463f92.tar.gz swap-modules-1f6771ade41edd7d2f7c9547672805d24b463f92.tar.bz2 swap-modules-1f6771ade41edd7d2f7c9547672805d24b463f92.zip |
[FIX] Fix wrong probe disarming in userspace (case with lr in regs)
Diffstat (limited to 'kprobe')
-rw-r--r-- | kprobe/arch/asm-arm/dbi_kprobes.c | 6 | ||||
-rw-r--r-- | kprobe/dbi_uprobes.c | 24 |
2 files changed, 16 insertions, 14 deletions
diff --git a/kprobe/arch/asm-arm/dbi_kprobes.c b/kprobe/arch/asm-arm/dbi_kprobes.c index e520c2b1..be50667d 100644 --- a/kprobe/arch/asm-arm/dbi_kprobes.c +++ b/kprobe/arch/asm-arm/dbi_kprobes.c @@ -1281,14 +1281,16 @@ int kprobe_handler(struct pt_regs *regs) p = get_kprobe_by_insn_slot(addr, tgid, regs); if (!p) { /* Not one of ours: let kernel handle it */ - DBPRINTF ("no_kprobe"); + printk("no_kprobe: Not one of ours: let " + "kernel handle it (userspace event) %p\n", addr); goto no_kprobe; } retprobe = 1; DBPRINTF ("uretprobe %p\n", addr); } else { /* Not one of ours: let kernel handle it */ - DBPRINTF ("no_kprobe"); + printk("no_kprobe: Not one of ours: " + "let kernel handle it (kernel event)\n"); goto no_kprobe; } } diff --git a/kprobe/dbi_uprobes.c b/kprobe/dbi_uprobes.c index 286de1fd..b96a63ff 100644 --- a/kprobe/dbi_uprobes.c +++ b/kprobe/dbi_uprobes.c @@ -291,7 +291,7 @@ int dbi_disarm_urp_inst(struct kretprobe_instance *ri, struct task_struct *rm_ta retval = read_proc_vm_atomic(task, (unsigned long)stack, buf, sizeof(buf)); if (retval != sizeof(buf)) { - printk("---> %s (%d/%d): failed to read stack from %08lx", + printk("---> %s (%d/%d): failed to read stack from %08lx\n", task->comm, task->tgid, task->pid, (unsigned long)stack); retval = -EFAULT; goto out; @@ -306,10 +306,10 @@ int dbi_disarm_urp_inst(struct kretprobe_instance *ri, struct task_struct *rm_ta } if (found) { - printk("---> %s (%d/%d): trampoline found at %08lx (%08lx /%+d) - %p\n", - task->comm, task->tgid, task->pid, - (unsigned long)found, (unsigned long)sp, - found - sp, ri->rp->kp.addr); + /* printk("---> %s (%d/%d): trampoline found at %08lx (%08lx /%+d) - %p\n", */ + /* task->comm, task->tgid, task->pid, */ + /* (unsigned long)found, (unsigned long)sp, */ + /* found - sp, ri->rp->kp.addr); */ retval = write_proc_vm_atomic(task, (unsigned long)found, &ri->ret_addr, sizeof(ri->ret_addr)); if (retval != sizeof(ri->ret_addr)) { @@ -323,9 +323,9 @@ int dbi_disarm_urp_inst(struct kretprobe_instance *ri, struct task_struct *rm_ta struct pt_regs *uregs = task_pt_regs(ri->task); unsigned long ra = dbi_get_ret_addr(uregs); if (ra == (unsigned long)tramp) { - printk("---> %s (%d/%d): trampoline found at lr = %08lx - %p\n", - task->comm, task->tgid, task->pid, ra, ri->rp->kp.addr); - dbi_set_ret_addr(uregs, (unsigned long)tramp); + /* printk("---> %s (%d/%d): trampoline found at lr = %08lx - %p\n", */ + /* task->comm, task->tgid, task->pid, ra, ri->rp->kp.addr); */ + dbi_set_ret_addr(uregs, (unsigned long)ri->ret_addr); retval = 0; } else { printk("---> %s (%d/%d): trampoline NOT found at sp = %08lx, lr = %08lx - %p\n", @@ -345,11 +345,12 @@ void dbi_unregister_uretprobe(struct task_struct *task, struct kretprobe *rp, in struct kretprobe_instance *ri; struct kretprobe *rp2 = NULL; + unregister_uprobe(&rp->kp, task, atomic); spin_lock_irqsave (&kretprobe_lock, flags); while ((ri = get_used_rp_inst(rp)) != NULL) { if (dbi_disarm_urp_inst(ri, NULL) != 0) - /*panic*/printk("%s (%d/%d): cannot disarm urp instance (%08lx)\n", + printk("%s (%d/%d): cannot disarm urp instance (%08lx)\n", ri->task->comm, ri->task->tgid, ri->task->pid, (unsigned long)rp->kp.addr); recycle_rp_inst(ri); @@ -413,7 +414,6 @@ void dbi_unregister_uretprobe(struct task_struct *task, struct kretprobe *rp, in spin_unlock_irqrestore(&kretprobe_lock, flags); free_rp_inst(rp); - unregister_uprobe(&rp->kp, task, atomic); } void dbi_unregister_all_uprobes(struct task_struct *task, int atomic) @@ -427,8 +427,8 @@ void dbi_unregister_all_uprobes(struct task_struct *task, int atomic) head = &kprobe_table[i]; swap_hlist_for_each_entry_safe(p, node, tnode, head, hlist) { if (p->tgid == task->tgid) { - printk("dbi_unregister_all_uprobes: delete uprobe at %p[%lx] for %s/%d\n", - p->addr, (unsigned long)p->opcode, task->comm, task->pid); + /* printk("dbi_unregister_all_uprobes: delete uprobe at %p[%lx] for %s/%d\n", */ + /* p->addr, (unsigned long)p->opcode, task->comm, task->pid); */ unregister_uprobe(p, task, atomic); } } |