]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf annotate-data: Ensure the number of type histograms
authorNamhyung Kim <namhyung@kernel.org>
Fri, 10 May 2024 21:04:52 +0000 (14:04 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Sat, 11 May 2024 16:03:13 +0000 (13:03 -0300)
Arnaldo reported that there is a case where nr_histograms and histograms
don't agree each other.

It ended up in a segfault trying to access a NULL histograms array.

Let's make sure to update the nr_histograms when the histograms array is
changed.

Reported-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240510210452.2449944-2-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/annotate-data.c

index 57e7d4b3550b42f8604893fc10ea78cadefdaab6..965da6c0b5427eaa0cea98e92e51e7c67e687f81 100644 (file)
@@ -1800,7 +1800,6 @@ static int alloc_data_type_histograms(struct annotated_data_type *adt, int nr_en
        sz += sizeof(struct type_hist_entry) * adt->self.size;
 
        /* Allocate a table of pointers for each event */
-       adt->nr_histograms = nr_entries;
        adt->histograms = calloc(nr_entries, sizeof(*adt->histograms));
        if (adt->histograms == NULL)
                return -ENOMEM;
@@ -1814,6 +1813,8 @@ static int alloc_data_type_histograms(struct annotated_data_type *adt, int nr_en
                if (adt->histograms[i] == NULL)
                        goto err;
        }
+
+       adt->nr_histograms = nr_entries;
        return 0;
 
 err:
@@ -1827,7 +1828,9 @@ static void delete_data_type_histograms(struct annotated_data_type *adt)
 {
        for (int i = 0; i < adt->nr_histograms; i++)
                zfree(&(adt->histograms[i]));
+
        zfree(&adt->histograms);
+       adt->nr_histograms = 0;
 }
 
 void annotated_data_type__tree_delete(struct rb_root *root)