From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org
Cc: Ingo Molnar <mingo@elte.hu>,
Andrew Morton <akpm@linux-foundation.org>,
Minchan Kim <minchan.kim@gmail.com>, Mel Gorman <mel@csn.ul.ie>,
Christoph Hellwig <hch@infradead.org>,
Rik van Riel <riel@redhat.com>,
Pekka Enberg <penberg@cs.helsinki.fi>,
Peter Zijlstra <peterz@infradead.org>,
Frederic Weisbecker <fweisbec@gmail.com>,
Theodore Tso <tytso@mit.edu>,
Mathieu Desnoyers <compudj@krystal.dyndns.org>,
Lai Jiangshan <laijs@cn.fujitsu.com>,
Zhaolei <zhaolei@cn.fujitsu.com>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Jason Baron <jbaron@redhat.com>,
Jiaying Zhang <jiayingz@google.com>,
Tom Zanussi <tzanussi@gmail.com>,
Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Subject: [PATCH 07/11] tracing: add test for strings in event tag format
Date: Wed, 10 Jun 2009 01:42:13 -0400 [thread overview]
Message-ID: <20090610054254.213236598@goodmis.org> (raw)
In-Reply-To: 20090610054206.510574695@goodmis.org
[-- Attachment #1: 0007-tracing-add-test-for-strings-in-event-tag-format.patch --]
[-- Type: text/plain, Size: 3864 bytes --]
From: Steven Rostedt <srostedt@redhat.com>
To protect against any disaster if a format uses a string when it
should have used something else, this code puts in test to make sure
the output will not cause any harm.
The entry size is passed to the format parser and checks are made
to ensure that the string read into the trace_seq at least has an
ending '\0' character within the range of the entry record.
[ Impact: prevent unpredictable results with bad formats ]
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
include/linux/ftrace_event.h | 3 +-
include/trace/ftrace.h | 2 +-
kernel/trace/trace_read_binary.c | 43 +++++++++++++++++++++++++++++++++----
3 files changed, 41 insertions(+), 7 deletions(-)
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h
index 1802459..26fed99 100644
--- a/include/linux/ftrace_event.h
+++ b/include/linux/ftrace_event.h
@@ -142,7 +142,8 @@ extern int filter_current_check_discard(struct ftrace_event_call *call,
extern char *ftrace_read_binary(struct trace_seq *p,
struct ftrace_event_call *event,
- struct trace_entry *entry);
+ struct trace_entry *entry,
+ int entry_size);
extern int ftrace_initialize_print(struct ftrace_event_call *event,
const char *fmt, ...)
__attribute__ ((format (printf, 2, 3)));
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h
index e3370c5..d250cb9 100644
--- a/include/trace/ftrace.h
+++ b/include/trace/ftrace.h
@@ -126,7 +126,7 @@
#undef TP_FORMAT
#define TP_FORMAT(fmt, args...) \
- "%s\n", ftrace_read_binary(p, event_call, entry)
+ "%s\n", ftrace_read_binary(p, event_call, entry, iter->ent_size)
#undef __get_dynamic_array
#define __get_dynamic_array(field) \
diff --git a/kernel/trace/trace_read_binary.c b/kernel/trace/trace_read_binary.c
index d005138..f3fdac8 100644
--- a/kernel/trace/trace_read_binary.c
+++ b/kernel/trace/trace_read_binary.c
@@ -738,9 +738,22 @@ get_val(void *p, int size, unsigned long long *mask)
return val;
}
+/* make sure string pointer has an end */
+static int test_string(const char *str, int size)
+{
+ int i;
+
+ for (i = 0; i < size; i++) {
+ if (!str[i])
+ return 0;
+ }
+
+ return -1;
+}
+
char *
ftrace_read_binary(struct trace_seq *s, struct ftrace_event_call *event,
- struct trace_entry *entry)
+ struct trace_entry *entry, int entry_size)
{
unsigned long long val, mask;
struct print_info *info;
@@ -748,6 +761,7 @@ ftrace_read_binary(struct trace_seq *s, struct ftrace_event_call *event,
struct ftrace_event_field *field;
unsigned long divisor, rem;
void *p;
+ int len;
if (!event->print_text) {
trace_seq_puts(s, "UNDEFINED EVENT\n");
@@ -834,18 +848,37 @@ ftrace_read_binary(struct trace_seq *s, struct ftrace_event_call *event,
break;
case FIELD_IS_STRING:
- p += info->data.field->offset;
+ field = info->data.field;
+ p += field->offset;
/* indexes are expected to be unsigned short */
- if (info->data.field->size != 2) {
- trace_seq_puts(s, "BAD FIELD SIZE\n");
+ if (field->size != 2) {
+ trace_seq_printf(s, "BAD FIELD SIZE %d\n",
+ field->size);
return start;
}
+ if (*(unsigned short *)p > entry_size) {
+ trace_seq_puts(s, "BAD STRING POINTER\n");
+ return start;
+ }
+ len = entry_size - *(unsigned short *)p;
p = (void *)entry + *(unsigned short *)p;
+
+ /* make sure that the string has an end */
+ if (test_string(p, len)) {
+ trace_seq_puts(s, "BAD STRING CONTENT\n");
+ return start;
+ }
+
trace_seq_puts(s, p);
break;
case FIELD_IS_STRARRAY:
- p += info->data.field->offset;
+ field = info->data.field;
+ p += field->offset;
+ if (test_string(p, field->size)) {
+ trace_seq_puts(s, "BAD STRING CONTENT\n");
+ return start;
+ }
trace_seq_puts(s, p);
break;
--
1.6.3.1
--
next prev parent reply other threads:[~2009-06-10 5:44 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-10 5:42 [PATCH 00/11] [GIT PULL] more updates for the tag format Steven Rostedt
2009-06-10 5:42 ` [PATCH 01/11] tracing/events: convert block trace points to TRACE_EVENT(), fix Steven Rostedt
2009-06-10 5:42 ` [PATCH 02/11] tracing: add nsec2sec print formats Steven Rostedt
2009-06-10 5:42 ` [PATCH 03/11] tracing: convert lockdep lock_acquired trace point to use nsec2usec tag Steven Rostedt
2009-06-10 5:42 ` [PATCH 04/11] tracing: add major and minor tags for print format Steven Rostedt
2009-06-10 5:42 ` [PATCH 05/11] tracing: use << to print < instead of \< Steven Rostedt
2009-06-10 5:42 ` [PATCH 06/11] tracing: convert the block trace points to use the new tag format Steven Rostedt
2009-06-10 5:42 ` Steven Rostedt [this message]
2009-06-10 5:42 ` [PATCH 08/11] tracing: add func and symfunc to " Steven Rostedt
2009-06-10 7:48 ` Frederic Weisbecker
2009-06-10 12:55 ` Steven Rostedt
2009-06-10 5:42 ` [PATCH 09/11] tracing: check full name for field Steven Rostedt
2009-06-10 5:42 ` [PATCH 10/11] tracing: update sample code with new tag format Steven Rostedt
2009-06-10 5:42 ` [PATCH 11/11] tracing: move > to out of macros and into print statement Steven Rostedt
2009-06-10 9:26 ` [PATCH 00/11] [GIT PULL] more updates for the tag format Ingo Molnar
2009-06-10 11:11 ` Frédéric Weisbecker
2009-06-10 13:01 ` Theodore Tso
2009-06-10 13:49 ` Steven Rostedt
2009-06-10 14:39 ` Mathieu Desnoyers
2009-06-10 15:21 ` Steven Rostedt
2009-06-10 16:03 ` Theodore Tso
2009-06-10 16:17 ` Steven Rostedt
2009-06-11 13:03 ` Christoph Hellwig
2009-06-11 15:47 ` Theodore Tso
2009-06-11 17:14 ` Frederic Weisbecker
2009-06-11 19:20 ` Theodore Tso
2009-06-19 8:14 ` [BUG] bugs in jbd2_dev_to_name() (was Re: [PATCH 00/11] [GIT PULL] more updates for the tag format) Li Zefan
2009-06-19 12:32 ` Theodore Tso
2009-06-22 1:36 ` Li Zefan
2009-06-22 1:36 ` Li Zefan
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=20090610054254.213236598@goodmis.org \
--to=rostedt@goodmis.org \
--cc=akpm@linux-foundation.org \
--cc=compudj@krystal.dyndns.org \
--cc=fweisbec@gmail.com \
--cc=hch@infradead.org \
--cc=jbaron@redhat.com \
--cc=jiayingz@google.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mel@csn.ul.ie \
--cc=minchan.kim@gmail.com \
--cc=mingo@elte.hu \
--cc=penberg@cs.helsinki.fi \
--cc=peterz@infradead.org \
--cc=riel@redhat.com \
--cc=tytso@mit.edu \
--cc=tzanussi@gmail.com \
--cc=xiaoguangrong@cn.fujitsu.com \
--cc=zhaolei@cn.fujitsu.com \
/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.