diff options
Diffstat (limited to 'kernel/kprobes.c')
-rw-r--r-- | kernel/kprobes.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index f4ddfdd2d07e..c83e54727131 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -1396,7 +1396,7 @@ bool __weak arch_within_kprobe_blacklist(unsigned long addr) | |||
1396 | addr < (unsigned long)__kprobes_text_end; | 1396 | addr < (unsigned long)__kprobes_text_end; |
1397 | } | 1397 | } |
1398 | 1398 | ||
1399 | bool within_kprobe_blacklist(unsigned long addr) | 1399 | static bool __within_kprobe_blacklist(unsigned long addr) |
1400 | { | 1400 | { |
1401 | struct kprobe_blacklist_entry *ent; | 1401 | struct kprobe_blacklist_entry *ent; |
1402 | 1402 | ||
@@ -1410,7 +1410,26 @@ bool within_kprobe_blacklist(unsigned long addr) | |||
1410 | if (addr >= ent->start_addr && addr < ent->end_addr) | 1410 | if (addr >= ent->start_addr && addr < ent->end_addr) |
1411 | return true; | 1411 | return true; |
1412 | } | 1412 | } |
1413 | return false; | ||
1414 | } | ||
1413 | 1415 | ||
1416 | bool within_kprobe_blacklist(unsigned long addr) | ||
1417 | { | ||
1418 | char symname[KSYM_NAME_LEN], *p; | ||
1419 | |||
1420 | if (__within_kprobe_blacklist(addr)) | ||
1421 | return true; | ||
1422 | |||
1423 | /* Check if the address is on a suffixed-symbol */ | ||
1424 | if (!lookup_symbol_name(addr, symname)) { | ||
1425 | p = strchr(symname, '.'); | ||
1426 | if (!p) | ||
1427 | return false; | ||
1428 | *p = '\0'; | ||
1429 | addr = (unsigned long)kprobe_lookup_name(symname, 0); | ||
1430 | if (addr) | ||
1431 | return __within_kprobe_blacklist(addr); | ||
1432 | } | ||
1414 | return false; | 1433 | return false; |
1415 | } | 1434 | } |
1416 | 1435 | ||