Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Chun-Tse Shao and committed by
Arnaldo Carvalho de Melo
8cdf00b8 208c0e16

+6 -3
+6 -3
tools/perf/util/maps.c
··· 1082 1082 while (!done) { 1083 1083 down_read(maps__lock(maps)); 1084 1084 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); 1088 1088 1089 + if (maps_by_address && nr_maps) 1090 + mapp = bsearch(&ip, maps_by_address, nr_maps, sizeof(*mapp), 1091 + map__addr_cmp); 1089 1092 if (mapp) 1090 1093 result = map__get(*mapp); 1091 1094 done = true;