]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
perf hist: Don't set hpp_fmt_value for members in --no-group
authorKan Liang <kan.liang@linux.intel.com>
Tue, 20 Aug 2024 18:32:02 +0000 (11:32 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 28 Aug 2024 21:07:20 +0000 (18:07 -0300)
Perf crashes as below when applying --no-group

  # perf record -e "{cache-misses,branches"} -b sleep 1
  # perf report --stdio --no-group
  free(): invalid next size (fast)
  Aborted (core dumped)
  #

In the __hpp__fmt(), only 1 hpp_fmt_value is allocated for the current
event when --no-group is applied.

However, the current implementation tries to assign the hists from all
members to the hpp_fmt_value, which exceeds the allocated memory.

Fixes: 8f6071a3dce40e69 ("perf hist: Simplify __hpp_fmt() using hpp_fmt_data")
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240820183202.3174323-1-kan.liang@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/ui/hist.c

index 5d1f04f66a5a15b421962bccc3b622e0f1b6d0c7..e5491995adf08bf25733d27c1b36a5c57c69a09d 100644 (file)
@@ -62,7 +62,7 @@ static int __hpp__fmt(struct perf_hpp *hpp, struct hist_entry *he,
        struct evsel *pos;
        char *buf = hpp->buf;
        size_t size = hpp->size;
-       int i, nr_members = 1;
+       int i = 0, nr_members = 1;
        struct hpp_fmt_value *values;
 
        if (evsel__is_group_event(evsel))
@@ -72,16 +72,16 @@ static int __hpp__fmt(struct perf_hpp *hpp, struct hist_entry *he,
        if (values == NULL)
                return 0;
 
-       i = 0;
-       for_each_group_evsel(pos, evsel)
-               values[i++].hists = evsel__hists(pos);
-
+       values[0].hists = evsel__hists(evsel);
        values[0].val = get_field(he);
        values[0].samples = he->stat.nr_events;
 
        if (evsel__is_group_event(evsel)) {
                struct hist_entry *pair;
 
+               for_each_group_member(pos, evsel)
+                       values[++i].hists = evsel__hists(pos);
+
                list_for_each_entry(pair, &he->pairs.head, pairs.node) {
                        for (i = 0; i < nr_members; i++) {
                                if (values[i].hists != pair->hists)