perf tools: Use strsep() over strtok_r() for parsing single line
The second argument in the strtok_r() function 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@redhat.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> LKML-Reference: <20091020232034.237814877@goodmis.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
60d526f7fa
Коммит
4e3b799d7d
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче