diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/kprobes.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index f9798ff7899f..e3a5d817ac9b 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -716,6 +716,18 @@ int __kprobes register_kretprobe(struct kretprobe *rp) | |||
716 | int ret = 0; | 716 | int ret = 0; |
717 | struct kretprobe_instance *inst; | 717 | struct kretprobe_instance *inst; |
718 | int i; | 718 | int i; |
719 | void *addr = rp->kp.addr; | ||
720 | |||
721 | if (kretprobe_blacklist_size) { | ||
722 | if (addr == NULL) | ||
723 | kprobe_lookup_name(rp->kp.symbol_name, addr); | ||
724 | addr += rp->kp.offset; | ||
725 | |||
726 | for (i = 0; kretprobe_blacklist[i].name != NULL; i++) { | ||
727 | if (kretprobe_blacklist[i].addr == addr) | ||
728 | return -EINVAL; | ||
729 | } | ||
730 | } | ||
719 | 731 | ||
720 | rp->kp.pre_handler = pre_handler_kretprobe; | 732 | rp->kp.pre_handler = pre_handler_kretprobe; |
721 | rp->kp.post_handler = NULL; | 733 | rp->kp.post_handler = NULL; |
@@ -794,6 +806,17 @@ static int __init init_kprobes(void) | |||
794 | INIT_HLIST_HEAD(&kretprobe_inst_table[i]); | 806 | INIT_HLIST_HEAD(&kretprobe_inst_table[i]); |
795 | } | 807 | } |
796 | 808 | ||
809 | if (kretprobe_blacklist_size) { | ||
810 | /* lookup the function address from its name */ | ||
811 | for (i = 0; kretprobe_blacklist[i].name != NULL; i++) { | ||
812 | kprobe_lookup_name(kretprobe_blacklist[i].name, | ||
813 | kretprobe_blacklist[i].addr); | ||
814 | if (!kretprobe_blacklist[i].addr) | ||
815 | printk("kretprobe: lookup failed: %s\n", | ||
816 | kretprobe_blacklist[i].name); | ||
817 | } | ||
818 | } | ||
819 | |||
797 | /* By default, kprobes are enabled */ | 820 | /* By default, kprobes are enabled */ |
798 | kprobe_enabled = true; | 821 | kprobe_enabled = true; |
799 | 822 | ||