public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2][GIT PULL] tracing: Prevent unloadable modules from using trace_bprintk()
@ 2010-10-21 13:45 Steven Rostedt
  2010-10-21 21:35 ` Rusty Russell
  2010-10-22  8:05 ` Ingo Molnar
  0 siblings, 2 replies; 11+ messages in thread
From: Steven Rostedt @ 2010-10-21 13:45 UTC (permalink / raw)
  To: LKML
  Cc: Ingo Molnar, Frederic Weisbecker, Andrew Morton, Thomas Gleixner,
	Linus Torvalds, Rusty Russell


Ingo,

This is based off of my core-2 branch. I'm moved this patch after that
so if anyone has any objections, I can change this patch without holding
off the previous one.

Note, I made the TRACE_BPRINTK_ALLOWED change since it looks better.

Thanks,

-- Steve

Please pull the latest tip/perf/core-3 tree, which can be found at:

  git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
tip/perf/core-3


Steven Rostedt (1):
      tracing: Prevent unloadable modules from using trace_bprintk()

----
 include/linux/kernel.h      |   20 ++++++++++++++++++--
 kernel/trace/trace_printk.c |    2 ++
 2 files changed, 20 insertions(+), 2 deletions(-)
---------------------------
commit c3b87c579e5df72a59fe97d77d4c3791dc8154ec
Author: Steven Rostedt <srostedt@redhat.com>
Date:   Wed Oct 20 20:50:00 2010 -0400

    tracing: Prevent unloadable modules from using trace_bprintk()
    
    While debugging a module, I found that unloading the module and
    then reading the ring buffer can cause strange side effects, including
    a kernel crash.
    
    This is due to the trace_bprintk(). The trace_bprintk() is a faster
    version of trace_printk(). The difference is that trace_bprintk()
    only copies the arguments and a pointer to the format string into
    the ring buffer.
    
    If a module uses this function and is unloaded, the pointer back to
    the format string in the module is still around. If the trace file
    is read, then the pointer is referenced and this can cause a kernel
    oops.
    
    The simple solution is to not let modules use trace_bprintk() and
    instead it will use the slower version of this.
    
    When talking with Frederic Weisbecker about it, he suggested not to
    punish modules that can not be unloaded since they do not have
    this side effect. Modules that can not be unloaded can still use
    trace_bprintk(). We added a check for MODVERSIONS to be set to make
    sure that the module and kernel have the same options. If you
    run without MODVERSIONS set, and you load a module that was compiled
    differently, then that's just your tough luck.
    
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 2b0a35e..9c683f3 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -538,6 +538,22 @@ do {									\
 		____trace_printk_check_format(fmt, ##args);		\
 } while (0)
 
+/*
+ * Module code must not use trace_bprintk, because if it is unloaded
+ * then we leave a pointer back to the module code inside
+ * the ring buffer, and then reading the ring buffer may cause a bug.
+ *
+ * We do allow for modules to use it if the kernel does not allow
+ * unloading of modules, and MODVERSIONS is set (to make sure kernel
+ * and module are the same). If you load modules without MODVERSIONS
+ * set, then you deserve what you get.
+ */
+#if defined(MODULE) && (defined(CONFIG_MODULE_UNLOAD) || !defined(CONFIG_MODVERSIONS))
+# define TRACE_BPRINTK_ALLOWED 0
+#else
+# define TRACE_BPRINTK_ALLOWED 1
+#endif
+
 /**
  * trace_printk - printf formatting in the ftrace buffer
  * @fmt: the printf format for printing
@@ -558,14 +574,14 @@ do {									\
 #define trace_printk(fmt, args...)					\
 do {									\
 	__trace_printk_check_format(fmt, ##args);			\
-	if (__builtin_constant_p(fmt)) {				\
+	if (__builtin_constant_p(fmt) && TRACE_BPRINTK_ALLOWED) {	\
 		static const char *trace_printk_fmt			\
 		  __attribute__((section("__trace_printk_fmt"))) =	\
 			__builtin_constant_p(fmt) ? fmt : NULL;		\
 									\
 		__trace_bprintk(_THIS_IP_, trace_printk_fmt, ##args);	\
 	} else								\
-		__trace_printk(_THIS_IP_, fmt, ##args);		\
+		__trace_printk(_THIS_IP_, fmt, ##args);			\
 } while (0)
 
 extern int
diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c
index 2547d88..230bbd9 100644
--- a/kernel/trace/trace_printk.c
+++ b/kernel/trace/trace_printk.c
@@ -115,7 +115,9 @@ int __trace_bprintk(unsigned long ip, const char *fmt, ...)
 	va_end(ap);
 	return ret;
 }
+#if TRACE_BPRINTK_ALLOWED
 EXPORT_SYMBOL_GPL(__trace_bprintk);
+#endif
 
 int __ftrace_vbprintk(unsigned long ip, const char *fmt, va_list ap)
  {



^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2010-10-25  1:31 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-21 13:45 [PATCH v2][GIT PULL] tracing: Prevent unloadable modules from using trace_bprintk() Steven Rostedt
2010-10-21 21:35 ` Rusty Russell
2010-10-21 22:34   ` Steven Rostedt
2010-10-22  3:43     ` Rusty Russell
2010-10-22  3:58       ` Steven Rostedt
2010-10-22  4:34         ` Rusty Russell
2010-10-22  5:30           ` Li Zefan
2010-10-22 13:49             ` Steven Rostedt
2010-10-25  1:32               ` Li Zefan
2010-10-22  8:05 ` Ingo Molnar
2010-10-22 13:50   ` Steven Rostedt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox