diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 1d5dd1337bd1cd4a089b13d1e67c749fe822234f..d8903e60c99abf3a73b57031cfdbaf86269ac9b3 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -107,13 +107,17 @@ int register_kprobe(struct kprobe *p) void unregister_kprobe(struct kprobe *p) { unsigned long flags; - arch_remove_kprobe(p); spin_lock_irqsave(&kprobe_lock, flags); + if (!get_kprobe(p->addr)) { + spin_unlock_irqrestore(&kprobe_lock, flags); + return; + } *p->addr = p->opcode; hlist_del(&p->hlist); flush_icache_range((unsigned long) p->addr, (unsigned long) p->addr + sizeof(kprobe_opcode_t)); spin_unlock_irqrestore(&kprobe_lock, flags); + arch_remove_kprobe(p); } static struct notifier_block kprobe_exceptions_nb = {