linux-stable/tools/perf/tests
Andi Kleen 475fb533fb perf evsel: Fix buffer overflow while freeing events
Fix buffer overflow for:

  % perf stat -e msr/tsc/,cstate_core/c7-residency/ true

that causes glibc free list corruption. For some reason it doesn't
trigger in valgrind, but it is visible in AS:

  =================================================================
  ==32681==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x603000003f5c at pc 0x0000005671ef bp 0x7ffdaaac9ac0 sp 0x7ffdaaac9ab0
  READ of size 4 at 0x603000003f5c thread T0
    #0 0x5671ee in perf_evsel__close_fd util/evsel.c:1196
    #1 0x56c57a in perf_evsel__close util/evsel.c:1717
    #2 0x55ed5f in perf_evlist__close util/evlist.c:1631
    #3 0x4647e1 in __run_perf_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:749
    #4 0x4648e3 in run_perf_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:767
    #5 0x46e1bc in cmd_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:2785
    #6 0x52f83d in run_builtin /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:296
    #7 0x52fd49 in handle_internal_command /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:348
    #8 0x5300de in run_argv /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:392
    #9 0x5308f3 in main /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:530
    #10 0x7f0672d13400 in __libc_start_main (/lib64/libc.so.6+0x20400)
    #11 0x428419 in _start (/home/ak/hle/obj-perf/perf+0x428419)

  0x603000003f5c is located 0 bytes to the right of 28-byte region [0x603000003f40,0x603000003f5c)
  allocated by thread T0 here:
    #0 0x7f0675139020 in calloc (/lib64/libasan.so.3+0xc7020)
    #1 0x648a2d in zalloc util/util.h:23
    #2 0x648a88 in xyarray__new util/xyarray.c:9
    #3 0x566419 in perf_evsel__alloc_fd util/evsel.c:1039
    #4 0x56b427 in perf_evsel__open util/evsel.c:1529
    #5 0x56c620 in perf_evsel__open_per_thread util/evsel.c:1730
    #6 0x461dea in create_perf_stat_counter /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:263
    #7 0x4637d7 in __run_perf_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:600
    #8 0x4648e3 in run_perf_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:767
    #9 0x46e1bc in cmd_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:2785
    #10 0x52f83d in run_builtin /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:296
    #11 0x52fd49 in handle_internal_command /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:348
    #12 0x5300de in run_argv /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:392
    #13 0x5308f3 in main /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:530
    #14 0x7f0672d13400 in __libc_start_main (/lib64/libc.so.6+0x20400)

The event is allocated with cpus == 1, but freed with cpus == real number
When the evsel close function walks the file descriptors it exceeds the
fd xyarray boundaries and reads random memory.

v2:

Now that xyarrays save their original dimensions we can use these to
iterate the two dimensional fd arrays. Fix some users (close, ioctl) in
evsel.c to use these fields directly. This allows simplifying the code
and dropping quite a few function arguments. Adjust all callers by
removing the unneeded arguments.

The actual perf event reading still uses the original values from the
evsel list.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20170811232634.30465-2-andi@firstfloor.org
[ Fix up xy_max_[xy]() -> xyarray__max_[xy]() ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2017-08-22 11:51:31 -03:00
..
attr perf tests attr: Add optional term 2017-07-18 23:14:22 -03:00
shell perf test shell: Replace '|&' with '2>&1 |' to work with more shells 2017-08-16 16:23:26 -03:00
.gitignore perf test: Add libbpf relocation checker 2016-01-26 12:10:55 -03:00
attr.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
attr.py perf tests attr: Add optional term 2017-07-18 23:14:22 -03:00
backward-ring-buffer.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
bitmap.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
bp_signal.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
bp_signal_overflow.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
bpf-script-example.c perf tests bpf: Use SyS_epoll_wait alias 2016-08-03 19:40:48 -03:00
bpf-script-test-kbuild.c perf test: Enhance the LLVM tests: add kbuild test 2015-11-06 17:49:50 -03:00
bpf-script-test-prologue.c perf bpf: Fix endianness problem when loading parameters in prologue 2017-08-16 10:31:11 -03:00
bpf-script-test-relocation.c perf test: Add libbpf relocation checker 2016-01-26 12:10:55 -03:00
bpf.c perf events parse: Rename parse_events_parse arguments 2017-08-17 16:39:15 -03:00
Build perf tools: Fix build with ARCH=x86_64 2017-06-14 15:44:29 -03:00
builtin-test.c perf test: Make 'list' use same filtering code as main 'perf test' 2017-08-11 16:06:27 -03:00
clang.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
code-reading.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
cpumap.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
dso-data.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
dwarf-unwind.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
event-times.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
event_update.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
evsel-roundtrip-name.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
evsel-tp-sched.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
expr.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
fdarray.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
hists_common.c perf tools: Including missing inttypes.h header 2017-04-19 13:01:46 -03:00
hists_common.h perf tests: Define and use symbolic names for fake symbols 2014-06-01 14:35:11 +02:00
hists_cumulate.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
hists_filter.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
hists_link.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
hists_output.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
is_printable_array.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
keep-tracking.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
kmod-path.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
llvm.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
llvm.h perf clang: Update test case to use real BPF script 2016-12-05 15:51:44 -03:00
make Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2016-12-17 16:24:13 -08:00
mmap-basic.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
mmap-thread-lookup.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
openat-syscall-all-cpus.c perf evsel: Fix buffer overflow while freeing events 2017-08-22 11:51:31 -03:00
openat-syscall-tp-fields.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
openat-syscall.c perf evsel: Fix buffer overflow while freeing events 2017-08-22 11:51:31 -03:00
parse-events.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
parse-no-sample-id-all.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
perf-hooks.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
perf-record.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
perf-targz-src-pkg perf tests: Fix tarpkg build test error output redirection 2016-03-24 12:26:41 -03:00
pmu.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
python-use.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
sample-parsing.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
sdt.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
stat.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
sw-clock.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
switch-tracking.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
task-exit.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
tests.h perf test: Add infrastructure to run shell based tests 2017-08-11 16:06:22 -03:00
thread-map.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
thread-mg-share.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
topology.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
unit_number__scnprintf.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00
vmlinux-kallsyms.c perf test: Add 'struct test *' to the test functions 2017-08-11 10:42:53 -03:00