diff options
author | Vyacheslav Cherkashin <v.cherkashin@samsung.com> | 2015-07-09 23:30:26 +0300 |
---|---|---|
committer | Vyacheslav Cherkashin <v.cherkashin@samsung.com> | 2015-07-10 02:53:56 +0300 |
commit | 97787d21b9c67cb437fc88c9482f4b0b7a78d93c (patch) | |
tree | 9ccd71937bcec4419d2ec2bc26a9abd9934f4ec6 /uprobe | |
parent | 5d7d6840f30dd3760c2c6db6cdd838bf05e842b1 (diff) | |
download | swap-modules-97787d21b9c67cb437fc88c9482f4b0b7a78d93c.tar.gz swap-modules-97787d21b9c67cb437fc88c9482f4b0b7a78d93c.tar.bz2 swap-modules-97787d21b9c67cb437fc88c9482f4b0b7a78d93c.zip |
[FIX] remove panic() from uprobe
Change-Id: I472ca5e1c71862578bc4a301ab1a94ec87780d00
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
Diffstat (limited to 'uprobe')
-rw-r--r-- | uprobe/swap_uprobes.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/uprobe/swap_uprobes.c b/uprobe/swap_uprobes.c index a94b0b79..45523d02 100644 --- a/uprobe/swap_uprobes.c +++ b/uprobe/swap_uprobes.c @@ -206,15 +206,19 @@ static int register_aggr_uprobe(struct kprobe *old_p, struct kprobe *p) return ret; } -static void arm_uprobe(struct uprobe *p) +static int arm_uprobe(struct uprobe *p) { kprobe_opcode_t insn = BREAKPOINT_INSTRUCTION; int ret = write_proc_vm_atomic(p->task, (unsigned long)p->kp.addr, &insn, sizeof(insn)); if (!ret) { - panic("arm_uprobe: failed to write memory " - "tgid=%u addr=%p!\n", p->task->tgid, p->kp.addr); + printk("arm_uprobe: failed to write memory " + "tgid=%u addr=%p!\n", p->task->tgid, p->kp.addr); + + return -EACCES; } + + return 0; } /** @@ -229,8 +233,8 @@ void disarm_uprobe(struct kprobe *p, struct task_struct *task) 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", task->tgid, p->addr); + printk("disarm_uprobe: failed to write memory " + "tgid=%u, addr=%p!\n", task->tgid, p->addr); } } EXPORT_SYMBOL_GPL(disarm_uprobe); @@ -522,7 +526,10 @@ int swap_register_uprobe(struct uprobe *up) INIT_HLIST_NODE(&p->hlist); hlist_add_head_rcu(&p->hlist, &uprobe_table[hash_ptr(p->addr, UPROBE_HASH_BITS)]); - arm_uprobe(up); + + ret = arm_uprobe(up); + if (ret) + remove_uprobe(up); out: DBPRINTF("out ret = 0x%x\n", ret); |