From: Arjan van de Ven <arjan@linux.intel.com>
To: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>,
linux-next@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>,
linuxppc-dev@ozlabs.org, mingo@elte.hu,
Andy Whitcroft <apw@shadowen.org>
Subject: Re: [BUG] linux-next: Tree for August 26 - Badness at kernel/notifier.c:25
Date: Tue, 26 Aug 2008 13:22:40 -0700 [thread overview]
Message-ID: <48B46610.1010809@linux.intel.com> (raw)
In-Reply-To: <48B44B2D.8070809@linux.vnet.ibm.com>
[-- Attachment #1: Type: text/plain, Size: 229 bytes --]
Kamalesh Babulal wrote:
> Hi Stephen,
>
> Badness warning is seen, while booting up the next-20080825/26 kernels on
> the powerpc boxes
>
this is fixed in the patch I sent to Ingo earlier today
(attached again for reference)
[-- Attachment #2: 0001-debug-add-notifier-chain-debugging.patch --]
[-- Type: text/x-patch, Size: 3175 bytes --]
>From eafa461d187448998b1f66c9134e66b125db9531 Mon Sep 17 00:00:00 2001
From: Arjan van de Ven <arjan@linux.intel.com>
Date: Tue, 26 Aug 2008 09:01:06 -0700
Subject: [PATCH] debug: add notifier chain debugging
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 <arjan@linux.intel.com>
Acked-by: Tony Luck <tony.luck@intel.com>
---
include/linux/kernel.h | 3 +++
kernel/extable.c | 16 ++++++++++++++++
kernel/notifier.c | 6 ++++++
lib/vsprintf.c | 2 +-
4 files changed, 26 insertions(+), 1 deletions(-)
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 2651f80..4e1366b 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -187,6 +187,9 @@ extern unsigned long long memparse(char *ptr, char **retptr);
extern int core_kernel_text(unsigned long addr);
extern int __kernel_text_address(unsigned long addr);
extern int kernel_text_address(unsigned long addr);
+extern int func_ptr_is_kernel_text(void *ptr);
+extern void *dereference_function_descriptor(void *ptr);
+
struct pid;
extern struct pid *session_of_pgrp(struct pid *pgrp);
diff --git a/kernel/extable.c b/kernel/extable.c
index a26cb2e..adf0cc9 100644
--- a/kernel/extable.c
+++ b/kernel/extable.c
@@ -66,3 +66,19 @@ int kernel_text_address(unsigned long addr)
return 1;
return module_text_address(addr) != NULL;
}
+
+/*
+ * On some architectures (PPC64, IA64) function pointers
+ * are actually only tokens to some data that then holds the
+ * real function address. As a result, to find if a function
+ * pointer is part of the kernel text, we need to do some
+ * special dereferencing first.
+ */
+int func_ptr_is_kernel_text(void *ptr)
+{
+ unsigned long addr;
+ addr = (unsigned long) dereference_function_descriptor(ptr);
+ if (core_kernel_text(addr))
+ return 1;
+ return module_text_address(addr) != NULL;
+}
diff --git a/kernel/notifier.c b/kernel/notifier.c
index 823be11..522277c 100644
--- a/kernel/notifier.c
+++ b/kernel/notifier.c
@@ -82,6 +82,12 @@ static int __kprobes notifier_call_chain(struct notifier_block **nl,
while (nb && nr_to_call) {
next_nb = rcu_dereference(nb->next);
+ if (!func_ptr_is_kernel_text(nb->notifier_call)) {
+ WARN(1, "Invalid notifier called!");
+ nb = next_nb;
+ continue;
+ }
+
ret = nb->notifier_call(nb, val, v);
if (nr_calls)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index d8d1d11..f5e5ffb 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -513,7 +513,7 @@ static char *string(char *buf, char *end, char *s, int field_width, int precisio
return buf;
}
-static inline void *dereference_function_descriptor(void *ptr)
+void *dereference_function_descriptor(void *ptr)
{
#if defined(CONFIG_IA64) || defined(CONFIG_PPC64)
void *p;
--
1.5.5.1
WARNING: multiple messages have this Message-ID (diff)
From: Arjan van de Ven <arjan@linux.intel.com>
To: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>,
LKML <linux-kernel@vger.kernel.org>,
linuxppc-dev@ozlabs.org, linux-next@vger.kernel.org,
mingo@elte.hu
Subject: Re: [BUG] linux-next: Tree for August 26 - Badness at kernel/notifier.c:25
Date: Tue, 26 Aug 2008 13:22:40 -0700 [thread overview]
Message-ID: <48B46610.1010809@linux.intel.com> (raw)
In-Reply-To: <48B44B2D.8070809@linux.vnet.ibm.com>
[-- Attachment #1: Type: text/plain, Size: 229 bytes --]
Kamalesh Babulal wrote:
> Hi Stephen,
>
> Badness warning is seen, while booting up the next-20080825/26 kernels on
> the powerpc boxes
>
this is fixed in the patch I sent to Ingo earlier today
(attached again for reference)
[-- Attachment #2: 0001-debug-add-notifier-chain-debugging.patch --]
[-- Type: text/x-patch, Size: 3175 bytes --]
>From eafa461d187448998b1f66c9134e66b125db9531 Mon Sep 17 00:00:00 2001
From: Arjan van de Ven <arjan@linux.intel.com>
Date: Tue, 26 Aug 2008 09:01:06 -0700
Subject: [PATCH] debug: add notifier chain debugging
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 <arjan@linux.intel.com>
Acked-by: Tony Luck <tony.luck@intel.com>
---
include/linux/kernel.h | 3 +++
kernel/extable.c | 16 ++++++++++++++++
kernel/notifier.c | 6 ++++++
lib/vsprintf.c | 2 +-
4 files changed, 26 insertions(+), 1 deletions(-)
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 2651f80..4e1366b 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -187,6 +187,9 @@ extern unsigned long long memparse(char *ptr, char **retptr);
extern int core_kernel_text(unsigned long addr);
extern int __kernel_text_address(unsigned long addr);
extern int kernel_text_address(unsigned long addr);
+extern int func_ptr_is_kernel_text(void *ptr);
+extern void *dereference_function_descriptor(void *ptr);
+
struct pid;
extern struct pid *session_of_pgrp(struct pid *pgrp);
diff --git a/kernel/extable.c b/kernel/extable.c
index a26cb2e..adf0cc9 100644
--- a/kernel/extable.c
+++ b/kernel/extable.c
@@ -66,3 +66,19 @@ int kernel_text_address(unsigned long addr)
return 1;
return module_text_address(addr) != NULL;
}
+
+/*
+ * On some architectures (PPC64, IA64) function pointers
+ * are actually only tokens to some data that then holds the
+ * real function address. As a result, to find if a function
+ * pointer is part of the kernel text, we need to do some
+ * special dereferencing first.
+ */
+int func_ptr_is_kernel_text(void *ptr)
+{
+ unsigned long addr;
+ addr = (unsigned long) dereference_function_descriptor(ptr);
+ if (core_kernel_text(addr))
+ return 1;
+ return module_text_address(addr) != NULL;
+}
diff --git a/kernel/notifier.c b/kernel/notifier.c
index 823be11..522277c 100644
--- a/kernel/notifier.c
+++ b/kernel/notifier.c
@@ -82,6 +82,12 @@ static int __kprobes notifier_call_chain(struct notifier_block **nl,
while (nb && nr_to_call) {
next_nb = rcu_dereference(nb->next);
+ if (!func_ptr_is_kernel_text(nb->notifier_call)) {
+ WARN(1, "Invalid notifier called!");
+ nb = next_nb;
+ continue;
+ }
+
ret = nb->notifier_call(nb, val, v);
if (nr_calls)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index d8d1d11..f5e5ffb 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -513,7 +513,7 @@ static char *string(char *buf, char *end, char *s, int field_width, int precisio
return buf;
}
-static inline void *dereference_function_descriptor(void *ptr)
+void *dereference_function_descriptor(void *ptr)
{
#if defined(CONFIG_IA64) || defined(CONFIG_PPC64)
void *p;
--
1.5.5.1
next prev parent reply other threads:[~2008-08-26 20:22 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-26 8:40 linux-next: Tree for August 26 Stephen Rothwell
2008-08-26 18:27 ` [BUG] linux-next: Tree for August 26 - Badness at kernel/notifier.c:25 Kamalesh Babulal
2008-08-26 18:27 ` Kamalesh Babulal
2008-08-26 20:22 ` Arjan van de Ven [this message]
2008-08-26 20:22 ` Arjan van de Ven
2008-08-27 11:12 ` Kamalesh Babulal
2008-08-27 11:12 ` Kamalesh Babulal
2008-08-27 13:48 ` Arjan van de Ven
2008-08-27 13:48 ` Arjan van de Ven
2008-08-27 14:33 ` Stephen Rothwell
2008-08-27 14:33 ` Stephen Rothwell
2008-08-27 14:38 ` Stephen Rothwell
2008-08-27 14:38 ` Stephen Rothwell
2008-08-28 14:23 ` David Woodhouse
2008-08-28 14:23 ` David Woodhouse
2008-08-28 14:55 ` David Woodhouse
2008-08-28 14:55 ` David Woodhouse
2008-08-28 17:14 ` Milton Miller
2008-08-28 17:14 ` Milton Miller
2008-08-27 17:52 ` Kamalesh Babulal
2008-08-27 17:52 ` Kamalesh Babulal
2008-08-26 23:49 ` [PATCH -next] net: fix compilation NG when !CONFIG_MODULE Hiroshi Shimamoto
2008-08-26 23:56 ` [PATCH -next] initramfs: fix compilation warning Hiroshi Shimamoto
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48B46610.1010809@linux.intel.com \
--to=arjan@linux.intel.com \
--cc=apw@shadowen.org \
--cc=kamalesh@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-next@vger.kernel.org \
--cc=linuxppc-dev@ozlabs.org \
--cc=mingo@elte.hu \
--cc=sfr@canb.auug.org.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.