diff options
Diffstat (limited to 'kernel/notifier.c')
-rw-r--r-- | kernel/notifier.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/kernel/notifier.c b/kernel/notifier.c index 823be11584ef..143fdd77dbf7 100644 --- a/kernel/notifier.c +++ b/kernel/notifier.c | |||
@@ -21,6 +21,10 @@ BLOCKING_NOTIFIER_HEAD(reboot_notifier_list); | |||
21 | static int notifier_chain_register(struct notifier_block **nl, | 21 | static int notifier_chain_register(struct notifier_block **nl, |
22 | struct notifier_block *n) | 22 | struct notifier_block *n) |
23 | { | 23 | { |
24 | if (!kernel_text_address((unsigned long)n->notifier_call)) { | ||
25 | WARN(1, "Invalid notifier registered!"); | ||
26 | return 0; | ||
27 | } | ||
24 | while ((*nl) != NULL) { | 28 | while ((*nl) != NULL) { |
25 | if (n->priority > (*nl)->priority) | 29 | if (n->priority > (*nl)->priority) |
26 | break; | 30 | break; |
@@ -34,6 +38,10 @@ static int notifier_chain_register(struct notifier_block **nl, | |||
34 | static int notifier_chain_cond_register(struct notifier_block **nl, | 38 | static int notifier_chain_cond_register(struct notifier_block **nl, |
35 | struct notifier_block *n) | 39 | struct notifier_block *n) |
36 | { | 40 | { |
41 | if (!kernel_text_address((unsigned long)n->notifier_call)) { | ||
42 | WARN(1, "Invalid notifier registered!"); | ||
43 | return 0; | ||
44 | } | ||
37 | while ((*nl) != NULL) { | 45 | while ((*nl) != NULL) { |
38 | if ((*nl) == n) | 46 | if ((*nl) == n) |
39 | return 0; | 47 | return 0; |
@@ -82,6 +90,14 @@ static int __kprobes notifier_call_chain(struct notifier_block **nl, | |||
82 | 90 | ||
83 | while (nb && nr_to_call) { | 91 | while (nb && nr_to_call) { |
84 | next_nb = rcu_dereference(nb->next); | 92 | next_nb = rcu_dereference(nb->next); |
93 | |||
94 | #ifdef CONFIG_DEBUG_NOTIFIERS | ||
95 | if (!kernel_text_address((unsigned long)nb->notifier_call)) { | ||
96 | WARN(1, "Invalid notifier called!"); | ||
97 | nb = next_nb; | ||
98 | continue; | ||
99 | } | ||
100 | #endif | ||
85 | ret = nb->notifier_call(nb, val, v); | 101 | ret = nb->notifier_call(nb, val, v); |
86 | 102 | ||
87 | if (nr_calls) | 103 | if (nr_calls) |