From 783ae89543201774d4aa04a49173217d62e7df84 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Wed, 10 Apr 2013 17:02:19 +0400 Subject: [PATCH] [FIX] correct disarm for children task --- driver/sspt/sspt.h | 2 +- uprobe/arch/asm-arm/swap_uprobes.c | 2 +- uprobe/swap_uprobes.c | 10 +++++----- uprobe/swap_uprobes.h | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/driver/sspt/sspt.h b/driver/sspt/sspt.h index a254816..79af2c0 100644 --- a/driver/sspt/sspt.h +++ b/driver/sspt/sspt.h @@ -108,7 +108,7 @@ static inline int unregister_usprobe_my(struct task_struct *task, struct us_ip * err = unregister_usprobe(task, ip, 1); break; case US_DISARM: - disarm_uprobe(&ip->jprobe.up); + disarm_uprobe(&ip->jprobe.up.kp, task); break; default: panic("incorrect value flag=%d", flag); diff --git a/uprobe/arch/asm-arm/swap_uprobes.c b/uprobe/arch/asm-arm/swap_uprobes.c index 5972c5a..e25f3ae 100644 --- a/uprobe/arch/asm-arm/swap_uprobes.c +++ b/uprobe/arch/asm-arm/swap_uprobes.c @@ -682,7 +682,7 @@ disarm: __FILE__, __LINE__, p->opcode, p->addr); /* Test case when we do our actions on already running application */ - disarm_uprobe(kp2up(p)); + disarm_uprobe(p, kp2up(p)->task); return -1; } diff --git a/uprobe/swap_uprobes.c b/uprobe/swap_uprobes.c index 40b6e13..0ef88ce 100644 --- a/uprobe/swap_uprobes.c +++ b/uprobe/swap_uprobes.c @@ -248,13 +248,13 @@ static void arm_uprobe(struct uprobe *p) } } -void disarm_uprobe(struct uprobe *p) +void disarm_uprobe(struct kprobe *p, struct task_struct *task) { - int ret = write_proc_vm_atomic(p->task, (unsigned long)p->kp.addr, - &p->kp.opcode, sizeof(p->kp.opcode)); + int ret = write_proc_vm_atomic(task, (unsigned long)p->addr, + &p->opcode, sizeof(p->opcode)); if (!ret) { panic("disarm_uprobe: failed to write memory " - "tgid=%u, addr=%p!\n", p->task->tgid, p->kp.addr); + "tgid=%u, addr=%p!\n", task->tgid, p->addr); } } EXPORT_SYMBOL_GPL(disarm_uprobe); @@ -596,7 +596,7 @@ valid_p: if ((old_p == p) || ((old_p->pre_handler == aggr_pre_uhandler) && (p->list.next == &old_p->list) && (p->list.prev == &old_p->list))) { /* Only probe on the hash list */ - disarm_uprobe(up); + disarm_uprobe(&up->kp, up->task); hlist_del_rcu(&old_p->hlist); cleanup_p = 1; } else { diff --git a/uprobe/swap_uprobes.h b/uprobe/swap_uprobes.h index df2dd56..678ce24 100644 --- a/uprobe/swap_uprobes.h +++ b/uprobe/swap_uprobes.h @@ -105,7 +105,7 @@ static inline struct kprobe *up2kp(struct uprobe *p) return &p->kp; } -void disarm_uprobe(struct uprobe *p); +void disarm_uprobe(struct kprobe *p, struct task_struct *task); int trampoline_uprobe_handler(struct kprobe *p, struct pt_regs *regs); -- 2.7.4