summaryrefslogtreecommitdiff
path: root/uprobe
diff options
context:
space:
mode:
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>2015-07-09 23:30:26 +0300
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>2015-07-10 02:53:56 +0300
commit97787d21b9c67cb437fc88c9482f4b0b7a78d93c (patch)
tree9ccd71937bcec4419d2ec2bc26a9abd9934f4ec6 /uprobe
parent5d7d6840f30dd3760c2c6db6cdd838bf05e842b1 (diff)
downloadswap-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.c19
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);