| From c1fdb5a253088cc79ee9911f324df30143d2e20c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 12 Sep 2019 12:52:35 +0200 |
| Subject: perf tools: Fix segfault in cpu_cache_level__read() |
| |
| From: Jiri Olsa <jolsa@kernel.org> |
| |
| [ Upstream commit 0216234c2eed1367a318daeb9f4a97d8217412a0 ] |
| |
| We release wrong pointer on error path in cpu_cache_level__read |
| function, leading to segfault: |
| |
| (gdb) r record ls |
| Starting program: /root/perf/tools/perf/perf record ls |
| ... |
| [ perf record: Woken up 1 times to write data ] |
| double free or corruption (out) |
| |
| Thread 1 "perf" received signal SIGABRT, Aborted. |
| 0x00007ffff7463798 in raise () from /lib64/power9/libc.so.6 |
| (gdb) bt |
| #0 0x00007ffff7463798 in raise () from /lib64/power9/libc.so.6 |
| #1 0x00007ffff7443bac in abort () from /lib64/power9/libc.so.6 |
| #2 0x00007ffff74af8bc in __libc_message () from /lib64/power9/libc.so.6 |
| #3 0x00007ffff74b92b8 in malloc_printerr () from /lib64/power9/libc.so.6 |
| #4 0x00007ffff74bb874 in _int_free () from /lib64/power9/libc.so.6 |
| #5 0x0000000010271260 in __zfree (ptr=0x7fffffffa0b0) at ../../lib/zalloc.. |
| #6 0x0000000010139340 in cpu_cache_level__read (cache=0x7fffffffa090, cac.. |
| #7 0x0000000010143c90 in build_caches (cntp=0x7fffffffa118, size=<optimiz.. |
| ... |
| |
| Releasing the proper pointer. |
| |
| Fixes: 720e98b5faf1 ("perf tools: Add perf data cache feature") |
| Signed-off-by: Jiri Olsa <jolsa@kernel.org> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Michael Petlan <mpetlan@redhat.com> |
| Cc: Namhyung Kim <namhyung@kernel.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: stable@vger.kernel.org: # v4.6+ |
| Link: http://lore.kernel.org/lkml/20190912105235.10689-1-jolsa@kernel.org |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/perf/util/header.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c |
| index 258b19b251a82..b3d947b98a7c2 100644 |
| --- a/tools/perf/util/header.c |
| +++ b/tools/perf/util/header.c |
| @@ -949,7 +949,7 @@ static int cpu_cache_level__read(struct cpu_cache_level *cache, u32 cpu, u16 lev |
| |
| scnprintf(file, PATH_MAX, "%s/shared_cpu_list", path); |
| if (sysfs__read_str(file, &cache->map, &len)) { |
| - free(cache->map); |
| + free(cache->size); |
| free(cache->type); |
| return -1; |
| } |
| -- |
| 2.20.1 |
| |