perf_counter: Zero dead bytes from ftrace raw samples size alignment
authorFrederic Weisbecker <fweisbec@gmail.com>
Mon, 10 Aug 2009 14:38:36 +0000 (16:38 +0200)
committerIngo Molnar <mingo@elte.hu>
Mon, 10 Aug 2009 14:51:19 +0000 (16:51 +0200)
After aligning the ftrace raw samples, there are dead bytes storing
random data from the stack. We don't want to leak these to userspace,
then zero these out.

Before:

0x2de88 [0x50]: event: 9
.
. ... raw event: size 80 bytes
.  0000:  09 00 00 00 01 00 50 00 d0 c7 00 81 ff ff ff ff  ......P........
.  0010:  68 01 00 00 68 01 00 00 2c 00 00 00 00 00 00 00  h...h...,......
.  0020:  2c 00 00 00 2b 00 01 02 68 01 00 00 68 01 00 00  ,...+...h...h..
.  0030:  6b 6f 6e 64 65 6d 61 6e 64 2f 30 00 00 00 00 00  kondemand/0....
.  0040:  68 01 00 00 40 7f 46 81 ff ff ff ff 00 10 1b 7f  h...@.F........
                                                      ^  ^  ^  ^
                                                         Leak

After:

0x2d318 [0x50]: event: 9
.
. ... raw event: size 80 bytes
.  0000:  09 00 00 00 01 00 50 00 d0 c7 00 81 ff ff ff ff  ......P........
.  0010:  68 01 00 00 68 01 00 00 68 14 00 00 00 00 00 00  h...h...h......
.  0020:  2c 00 00 00 2b 00 01 02 68 01 00 00 68 01 00 00  ,...+...h...h..
.  0030:  6b 6f 6e 64 65 6d 61 6e 64 2f 30 00 00 00 00 00  kondemand/0....
.  0040:  68 01 00 00 a0 80 46 81 ff ff ff ff 00 00 00 00  h.....F........
                                                      ^  ^  ^  ^
 Fixed

Reported-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
LKML-Reference: <1249915116-5210-1-git-send-email-fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
include/trace/ftrace.h

index a05524f..f64fbaa 100644 (file)
@@ -648,6 +648,9 @@ __attribute__((section("_ftrace_events"))) event_##call = {         \
  *             char raw_data[__entry_size]; <- allocate our sample in the stack
  *             struct trace_entry *ent;
  *
+ *             zero dead bytes from alignment to avoid stack leak to userspace:
+ *
+ *             *(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL;
  *             entry = (struct ftrace_raw_<call> *)raw_data;
  *             ent = &entry->ent;
  *             tracing_generic_entry_update(ent, irq_flags, pc);
@@ -698,6 +701,7 @@ static void ftrace_profile_##call(proto)                            \
                char raw_data[__entry_size];                            \
                struct trace_entry *ent;                                \
                                                                        \
+               *(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL; \
                entry = (struct ftrace_raw_##call *)raw_data;           \
                ent = &entry->ent;                                      \
                tracing_generic_entry_update(ent, irq_flags, pc);       \