diff options
author | Namhyung Kim <namhyung@kernel.org> | 2015-03-12 03:32:46 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-03-13 06:47:47 -0400 |
commit | 405f87557da35a03ba4663eca971ffac58b0a818 (patch) | |
tree | b3af3a68a2e0eee48fe46d92daf2580b750d227a /tools | |
parent | 7910352852f377f6d12286f922299d7ad1cfb2e3 (diff) |
perf kmem: Fix segfault when invalid sort key is given
When it tries to free 'str', it was already updated by strsep() - so it
needs to save the original pointer.
# perf kmem stat -s xxx,hit
Error: Unknown --sort key: 'xxx'
*** Error in `perf': free(): invalid pointer: 0x0000000000e9e7b6 ***
======= Backtrace: =========
/usr/lib/libc.so.6(+0x7198e)[0x7fc7e6e0d98e]
/usr/lib/libc.so.6(+0x76dee)[0x7fc7e6e12dee]
/usr/lib/libc.so.6(+0x775cb)[0x7fc7e6e135cb]
./perf[0x44a1b5]
./perf[0x490b20]
./perf(parse_options_step+0x173)[0x491773]
./perf(parse_options_subcommand+0xa7)[0x491fb7]
./perf(cmd_kmem+0x2bc)[0x44ae4c]
./perf[0x47aa13]
./perf(main+0x60a)[0x427a9a]
/usr/lib/libc.so.6(__libc_start_main+0xf0)[0x7fc7e6dbc800]
./perf(_start+0x29)[0x427bb9]
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Joonsoo Kim <js1304@gmail.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1426145571-3065-2-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/builtin-kmem.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 62f165a9fa40..1e69ea57a1cc 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
@@ -559,6 +559,7 @@ static int setup_sorting(struct list_head *sort_list, const char *arg) | |||
559 | { | 559 | { |
560 | char *tok; | 560 | char *tok; |
561 | char *str = strdup(arg); | 561 | char *str = strdup(arg); |
562 | char *pos = str; | ||
562 | 563 | ||
563 | if (!str) { | 564 | if (!str) { |
564 | pr_err("%s: strdup failed\n", __func__); | 565 | pr_err("%s: strdup failed\n", __func__); |
@@ -566,7 +567,7 @@ static int setup_sorting(struct list_head *sort_list, const char *arg) | |||
566 | } | 567 | } |
567 | 568 | ||
568 | while (true) { | 569 | while (true) { |
569 | tok = strsep(&str, ","); | 570 | tok = strsep(&pos, ","); |
570 | if (!tok) | 571 | if (!tok) |
571 | break; | 572 | break; |
572 | if (sort_dimension__add(tok, sort_list) < 0) { | 573 | if (sort_dimension__add(tok, sort_list) < 0) { |