[PATCH 2/2] [PATCH 2/2] perf tools: use strsep over strtok_r for parsing single line

From: Steven Rostedt
Date: Tue Oct 20 2009 - 19:21:01 EST


From: Steven Rostedt <srostedt@xxxxxxxxxx>

The second argument in the strtok_r is not to be used generically and can
have different implementations. Currently the function parsing of
the perf trace code uses the second argument to copy data from.
This can crash the tool or just have unpredictable results.

The correct solution is to use strsep which has a defined result.

I also added a check to see if the result was correct, and will break
out of the loop in case it fails to parse as expected.

Reported-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Cc: Frederic Weisbecker <fweisbec@xxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxx>
LKML-Reference: <1255971369-11368-1-git-send-email-acme@xxxxxxxxxx>
Signed-off-by: Steven Rostedt <rostedt@xxxxxxxxxxx>
---
tools/perf/util/trace-event-parse.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
index 4b61b49..eae5605 100644
--- a/tools/perf/util/trace-event-parse.c
+++ b/tools/perf/util/trace-event-parse.c
@@ -286,16 +286,19 @@ void parse_ftrace_printk(char *file, unsigned int size __unused)
char *line;
char *next = NULL;
char *addr_str;
- char *fmt;
int i;

line = strtok_r(file, "\n", &next);
while (line) {
+ addr_str = strsep(&line, ":");
+ if (!line) {
+ warning("error parsing print strings");
+ break;
+ }
item = malloc_or_die(sizeof(*item));
- addr_str = strtok_r(line, ":", &fmt);
item->addr = strtoull(addr_str, NULL, 16);
/* fmt still has a space, skip it */
- item->printk = strdup(fmt+1);
+ item->printk = strdup(line+1);
item->next = list;
list = item;
line = strtok_r(NULL, "\n", &next);
--
1.6.3.3


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/