Skip to content

Commit 8cdf00b

Browse files
Chun-Tse Shaoacmel
authored andcommitted
perf record: Fix a asan runtime error in util/maps.c
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>
1 parent 208c0e1 commit 8cdf00b

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

tools/perf/util/maps.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,10 +1082,13 @@ struct map *maps__find(struct maps *maps, u64 ip)
10821082
while (!done) {
10831083
down_read(maps__lock(maps));
10841084
if (maps__maps_by_address_sorted(maps)) {
1085-
struct map **mapp =
1086-
bsearch(&ip, maps__maps_by_address(maps), maps__nr_maps(maps),
1087-
sizeof(*mapp), map__addr_cmp);
1085+
struct map **mapp = NULL;
1086+
struct map **maps_by_address = maps__maps_by_address(maps);
1087+
unsigned int nr_maps = maps__nr_maps(maps);
10881088

1089+
if (maps_by_address && nr_maps)
1090+
mapp = bsearch(&ip, maps_by_address, nr_maps, sizeof(*mapp),
1091+
map__addr_cmp);
10891092
if (mapp)
10901093
result = map__get(*mapp);
10911094
done = true;

0 commit comments

Comments
 (0)