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

perf evlist: Check 'base' pointer before checking refcnt when put a mmap

evlist->mmap[i]->refcnt could be 0 if an evlist has no evsel or if all
evsels don't match the evlist during mmap. For example, when all evsels
are overwritable but the evlist itself is normal. To avoid crashing,
perf should check 'base' pointer before checking refcnt, and raise bug
only when base is not NULL.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1464183898-174512-2-git-send-email-wangnan0@huawei.com
[ Renamed 'mmap' variable, it is reserved in old distros such as Ubuntu 12.04, breaking the build ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Wang Nan and committed by
Arnaldo Carvalho de Melo
e10e4ef6 f3058a1c

+4 -2
+4 -2
tools/perf/util/evlist.c
··· 856 856 857 857 static void perf_evlist__mmap_put(struct perf_evlist *evlist, int idx) 858 858 { 859 - BUG_ON(atomic_read(&evlist->mmap[idx].refcnt) == 0); 859 + struct perf_mmap *md = &evlist->mmap[idx]; 860 860 861 - if (atomic_dec_and_test(&evlist->mmap[idx].refcnt)) 861 + BUG_ON(md->base && atomic_read(&md->refcnt) == 0); 862 + 863 + if (atomic_dec_and_test(&md->refcnt)) 862 864 __perf_evlist__munmap(evlist, idx); 863 865 } 864 866