X-Git-Url: https://bbs.cooldavid.org/git/?a=blobdiff_plain;f=kernel%2Fkprobes.c;h=1b0dbe0670770f2fece89c78335752ed7619b397;hb=05662bdb64c746079de7ac4dc4fb4caa5e8e119f;hp=282035f3ae964e1e288f352c370be8edd11d3078;hpb=e90e4d9234c953b29267cc4fc9ad804128773313;p=net-next-2.6.git diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 282035f3ae9..1b0dbe06707 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -1339,18 +1339,19 @@ int __kprobes register_jprobes(struct jprobe **jps, int num) if (num <= 0) return -EINVAL; for (i = 0; i < num; i++) { - unsigned long addr; + unsigned long addr, offset; jp = jps[i]; addr = arch_deref_entry_point(jp->entry); - if (!kernel_text_address(addr)) - ret = -EINVAL; - else { - /* Todo: Verify probepoint is a function entry point */ + /* Verify probepoint is a function entry point */ + if (kallsyms_lookup_size_offset(addr, NULL, &offset) && + offset == 0) { jp->kp.pre_handler = setjmp_pre_handler; jp->kp.break_handler = longjmp_break_handler; ret = register_kprobe(&jp->kp); - } + } else + ret = -EINVAL; + if (ret < 0) { if (i > 0) unregister_jprobes(jps, i);