]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf record: Fix a asan runtime error in util/maps.c
authorChun-Tse Shao <ctshao@google.com>
Mon, 3 Mar 2025 18:32:41 +0000 (10:32 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 16 May 2025 20:31:40 +0000 (17:31 -0300)
If I build perf with asan and run Zstd test:

  $ make -C tools/perf O=/tmp/perf DEBUG=1 EXTRA_CFLAGS="-O0 -g -fno-omit-frame-pointer -fsanitize=undefined"
  $ /tmp/perf/perf test "Zstd perf.data compression/decompression" -vv
   83: Zstd perf.data compression/decompression:
  ...
  util/maps.c:1046:5: runtime error: null pointer passed as argument 2, which is declared to never be null
  ...

The issue was caused by `bsearch`. The patch adds a check to ensure
argument 2 and 3 are not NULL and 0.

Testing with the commands above confirms that the runtime error is
resolved.

Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Chun-Tse Shao <ctshao@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ben Gainey <ben.gainey@arm.com>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Nick Terrell <terrelln@fb.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250303183646.327510-2-ctshao@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/maps.c

index 0b40d901675ed57e6f300e54817efdcbef807316..85b2a93a59ac6580505c6a960f52198a40a45202 100644 (file)
@@ -1082,10 +1082,13 @@ struct map *maps__find(struct maps *maps, u64 ip)
        while (!done) {
                down_read(maps__lock(maps));
                if (maps__maps_by_address_sorted(maps)) {
-                       struct map **mapp =
-                               bsearch(&ip, maps__maps_by_address(maps), maps__nr_maps(maps),
-                                       sizeof(*mapp), map__addr_cmp);
+                       struct map **mapp = NULL;
+                       struct map **maps_by_address = maps__maps_by_address(maps);
+                       unsigned int nr_maps = maps__nr_maps(maps);
 
+                       if (maps_by_address && nr_maps)
+                               mapp = bsearch(&ip, maps_by_address, nr_maps, sizeof(*mapp),
+                                              map__addr_cmp);
                        if (mapp)
                                result = map__get(*mapp);
                        done = true;