|
@@ -1339,14 +1339,18 @@ 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);
|
|
|
|
|
|
- /* Todo: Verify probepoint is a function entry point */
|
|
|
- jp->kp.pre_handler = setjmp_pre_handler;
|
|
|
- jp->kp.break_handler = longjmp_break_handler;
|
|
|
- ret = register_kprobe(&jp->kp);
|
|
|
+ /* 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)
|