hc
2024-02-20 e636c8d336489bf3eed5878299e6cc045bbad077
kernel/kernel/kprobes.c
....@@ -447,8 +447,8 @@
447447 return 0;
448448 }
449449
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)
452452 {
453453 struct optimized_kprobe *op;
454454
....@@ -652,7 +652,7 @@
652652 mutex_unlock(&kprobe_mutex);
653653 }
654654
655
-static bool optprobe_queued_unopt(struct optimized_kprobe *op)
655
+bool optprobe_queued_unopt(struct optimized_kprobe *op)
656656 {
657657 struct optimized_kprobe *_op;
658658
....@@ -1628,6 +1628,17 @@
16281628 return 0;
16291629 }
16301630
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
+
16311642 static int check_kprobe_address_safe(struct kprobe *p,
16321643 struct module **probed_mod)
16331644 {
....@@ -1646,7 +1657,8 @@
16461657 within_kprobe_blacklist((unsigned long) p->addr) ||
16471658 jump_label_text_reserved(p->addr, p->addr) ||
16481659 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)) {
16501662 ret = -EINVAL;
16511663 goto out;
16521664 }