.. | .. |
---|
447 | 447 | return 0; |
---|
448 | 448 | } |
---|
449 | 449 | |
---|
450 | | -/* Return true(!0) if the kprobe is disarmed. Note: p must be on hash list */ |
---|
451 | | -static inline int kprobe_disarmed(struct kprobe *p) |
---|
| 450 | +/* Return true if the kprobe is disarmed. Note: p must be on hash list */ |
---|
| 451 | +bool kprobe_disarmed(struct kprobe *p) |
---|
452 | 452 | { |
---|
453 | 453 | struct optimized_kprobe *op; |
---|
454 | 454 | |
---|
.. | .. |
---|
652 | 652 | mutex_unlock(&kprobe_mutex); |
---|
653 | 653 | } |
---|
654 | 654 | |
---|
655 | | -static bool optprobe_queued_unopt(struct optimized_kprobe *op) |
---|
| 655 | +bool optprobe_queued_unopt(struct optimized_kprobe *op) |
---|
656 | 656 | { |
---|
657 | 657 | struct optimized_kprobe *_op; |
---|
658 | 658 | |
---|
.. | .. |
---|
1628 | 1628 | return 0; |
---|
1629 | 1629 | } |
---|
1630 | 1630 | |
---|
| 1631 | +static bool is_cfi_preamble_symbol(unsigned long addr) |
---|
| 1632 | +{ |
---|
| 1633 | + char symbuf[KSYM_NAME_LEN]; |
---|
| 1634 | + |
---|
| 1635 | + if (lookup_symbol_name(addr, symbuf)) |
---|
| 1636 | + return false; |
---|
| 1637 | + |
---|
| 1638 | + return str_has_prefix("__cfi_", symbuf) || |
---|
| 1639 | + str_has_prefix("__pfx_", symbuf); |
---|
| 1640 | +} |
---|
| 1641 | + |
---|
1631 | 1642 | static int check_kprobe_address_safe(struct kprobe *p, |
---|
1632 | 1643 | struct module **probed_mod) |
---|
1633 | 1644 | { |
---|
.. | .. |
---|
1646 | 1657 | within_kprobe_blacklist((unsigned long) p->addr) || |
---|
1647 | 1658 | jump_label_text_reserved(p->addr, p->addr) || |
---|
1648 | 1659 | static_call_text_reserved(p->addr, p->addr) || |
---|
1649 | | - find_bug((unsigned long)p->addr)) { |
---|
| 1660 | + find_bug((unsigned long)p->addr) || |
---|
| 1661 | + is_cfi_preamble_symbol((unsigned long)p->addr)) { |
---|
1650 | 1662 | ret = -EINVAL; |
---|
1651 | 1663 | goto out; |
---|
1652 | 1664 | } |
---|