Skip to content

Commit

Permalink
debug: add notifier chain debugging
Browse files Browse the repository at this point in the history
during some development we suspected a case where we left something
in a notifier chain that was from a module that was unloaded already...
and that sort of thing is rather hard to track down.

This patch adds a very simple sanity check (which isn't all that
expensive) to make sure the notifier we're about to call is
actually from either the kernel itself of from a still-loaded
module, avoiding a hard-to-chase-down crash.

Signed-off-by: Arjan van de Ven <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
fenrus75 authored and Ingo Molnar committed Sep 10, 2008
1 parent b09c3e3 commit 1b2439d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
16 changes: 16 additions & 0 deletions kernel/notifier.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ BLOCKING_NOTIFIER_HEAD(reboot_notifier_list);
static int notifier_chain_register(struct notifier_block **nl,
struct notifier_block *n)
{
if (!kernel_text_address((unsigned long)n->notifier_call)) {
WARN(1, "Invalid notifier registered!");
return 0;
}
while ((*nl) != NULL) {
if (n->priority > (*nl)->priority)
break;
Expand All @@ -34,6 +38,10 @@ static int notifier_chain_register(struct notifier_block **nl,
static int notifier_chain_cond_register(struct notifier_block **nl,
struct notifier_block *n)
{
if (!kernel_text_address((unsigned long)n->notifier_call)) {
WARN(1, "Invalid notifier registered!");
return 0;
}
while ((*nl) != NULL) {
if ((*nl) == n)
return 0;
Expand Down Expand Up @@ -82,6 +90,14 @@ static int __kprobes notifier_call_chain(struct notifier_block **nl,

while (nb && nr_to_call) {
next_nb = rcu_dereference(nb->next);

#ifdef CONFIG_DEBUG_NOTIFIERS
if (!kernel_text_address((unsigned long)nb->notifier_call)) {
WARN(1, "Invalid notifier called!");
nb = next_nb;
continue;
}
#endif
ret = nb->notifier_call(nb, val, v);

if (nr_calls)
Expand Down
10 changes: 10 additions & 0 deletions lib/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,16 @@ config DEBUG_SG

If unsure, say N.

config DEBUG_NOTIFIERS
bool "Debug notifier call chains"
depends on DEBUG_KERNEL
help
Enable this to turn on sanity checking for notifier call chains.
This is most useful for kernel developers to make sure that
modules properly unregister themselves from notifier chains.
This is a relatively cheap check but if you care about maximum
performance, say N.

config FRAME_POINTER
bool "Compile the kernel with frame pointers"
depends on DEBUG_KERNEL && \
Expand Down

0 comments on commit 1b2439d

Please sign in to comment.