Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e10e4ef6 authored by Wang Nan's avatar Wang Nan Committed by Arnaldo Carvalho de Melo
Browse files

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: default avatarWang 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent f3058a1c
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -856,9 +856,11 @@ static void perf_evlist__mmap_get(struct perf_evlist *evlist, int idx)

static void perf_evlist__mmap_put(struct perf_evlist *evlist, int idx)
{
	BUG_ON(atomic_read(&evlist->mmap[idx].refcnt) == 0);
	struct perf_mmap *md = &evlist->mmap[idx];

	BUG_ON(md->base && atomic_read(&md->refcnt) == 0);

	if (atomic_dec_and_test(&evlist->mmap[idx].refcnt))
	if (atomic_dec_and_test(&md->refcnt))
		__perf_evlist__munmap(evlist, idx);
}