X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=kernel%2Fkprobes.c;h=e3a5d817ac9b0f07b514587a7ec03453461ab655;hb=75e7766680b4b196073bdc941b8a6570b9f777af;hp=f9798ff7899f4a610823fd641fe5e2dde0e746f7;hpb=74a0b5762713a26496db72eac34fbbed46f20fce;p=linux-2.6 diff --git a/kernel/kprobes.c b/kernel/kprobes.c index f9798ff789..e3a5d817ac 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -716,6 +716,18 @@ int __kprobes register_kretprobe(struct kretprobe *rp) int ret = 0; struct kretprobe_instance *inst; int i; + void *addr = rp->kp.addr; + + if (kretprobe_blacklist_size) { + if (addr == NULL) + kprobe_lookup_name(rp->kp.symbol_name, addr); + addr += rp->kp.offset; + + for (i = 0; kretprobe_blacklist[i].name != NULL; i++) { + if (kretprobe_blacklist[i].addr == addr) + return -EINVAL; + } + } rp->kp.pre_handler = pre_handler_kretprobe; rp->kp.post_handler = NULL; @@ -794,6 +806,17 @@ static int __init init_kprobes(void) INIT_HLIST_HEAD(&kretprobe_inst_table[i]); } + if (kretprobe_blacklist_size) { + /* lookup the function address from its name */ + for (i = 0; kretprobe_blacklist[i].name != NULL; i++) { + kprobe_lookup_name(kretprobe_blacklist[i].name, + kretprobe_blacklist[i].addr); + if (!kretprobe_blacklist[i].addr) + printk("kretprobe: lookup failed: %s\n", + kretprobe_blacklist[i].name); + } + } + /* By default, kprobes are enabled */ kprobe_enabled = true;