perf tools: Fix error handling of unknown events
authorStephane Eranian <eranian@google.com>
Sat, 23 Jul 2011 02:10:43 +0000 (04:10 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 18 Aug 2011 10:21:13 +0000 (07:21 -0300)
There was a problem with the parse_events() code not printing the
correct event name when an event was unknown and starting with an 'r'.
The source of the problem was the way raw notation was parsed.

Without the patch:
$ perf stat -e retired_foo
invalid event modifier: 'tired_foo'

With the patch:
$ perf stat -e retired_foo
invalid or unsupported event: 'retired_foo'

This also covers the case where the name of the event was not printed at
all when perf was linked with libpfm4.

Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20110723021043.GA20178@quad
Signed-off-by: Stephane Eranian <eranian@google.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/parse-events.c

index d93f3cea93c749c557470635cf5a1bde4a34899b..928918b796b2bd355799cf25926d926fea002bad 100644 (file)
@@ -697,7 +697,11 @@ parse_raw_event(const char **strp, struct perf_event_attr *attr)
                return EVT_FAILED;
        n = hex2u64(str + 1, &config);
        if (n > 0) {
-               *strp = str + n + 1;
+               const char *end = str + n + 1;
+               if (*end != '\0' && *end != ',' && *end != ':')
+                       return EVT_FAILED;
+
+               *strp = end;
                attr->type = PERF_TYPE_RAW;
                attr->config = config;
                return EVT_HANDLED;