struct task_struct *task)
{
int err = 0;
- struct us_ip *ip;
+ struct us_ip *ip, *n;
spin_lock(&page->lock);
sspt_page_assert_install(page);
sspt_set_all_ip_addr(page, file);
- list_for_each_entry(ip, &page->ip_list, list) {
+ list_for_each_entry_safe(ip, n, &page->ip_list, list) {
err = register_usprobe_my(task, ip);
- if (err != 0) {
- //TODO: ERROR
- goto unlock;
+ if (err == -ENOEXEC) {
+ list_del(&ip->list);
+ free_ip(ip);
+ continue;
+ } else if (err) {
+ EPRINTF("Failed to install probe");
}
}
-
- sspt_page_installed(page);
-
unlock:
+ sspt_page_installed(page);
spin_unlock(&page->lock);
- return err;
+ return 0;
}
static int unregister_us_page_probe(struct task_struct *task,
if ((p->safe_arm == -1) && (p->safe_thumb == -1)) {
printk("Error in %s at %d: failed arch_copy_trampoline_*_uprobe() (both) [tgid=%u, addr=%lx, data=%lx]\n",
__FILE__, __LINE__, task->tgid, (unsigned long)p->addr, (unsigned long)p->opcode);
- if (!write_proc_vm_atomic (task, (unsigned long) p->addr, &p->opcode, sizeof (p->opcode)))
- panic ("Failed to write memory %p!\n", p->addr);
free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_arm);
free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_thumb);
return -ENOEXEC;