mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
perf top: Fix BPF support related crash with perf_event_paranoid=3 + kptr_restrict
After installing the libelf-dev package and compiling perf, if we have kptr_restrict=2 and perf_event_paranoid=3 'perf top' will crash because the value of /proc/kallsyms cannot be obtained, which leads to info->jited_ksyms == NULL. In order to solve this problem, Add a check before use. Also plug some leaks on the error path. Suggested-by: Jiri Olsa <jolsa@redhat.com> Signed-off-by: Jackie Liu <liuyun01@kylinos.cn> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: jackie liu <liuyun01@kylinos.cn> Link: http://lore.kernel.org/lkml/20210316012453.1156-1-liuyun01@kylinos.cn Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
e40647762f
commit
1a096ae46e
@ -196,25 +196,32 @@ static int perf_event__synthesize_one_bpf_prog(struct perf_session *session,
|
||||
}
|
||||
|
||||
if (info_linear->info_len < offsetof(struct bpf_prog_info, prog_tags)) {
|
||||
free(info_linear);
|
||||
pr_debug("%s: the kernel is too old, aborting\n", __func__);
|
||||
return -2;
|
||||
}
|
||||
|
||||
info = &info_linear->info;
|
||||
if (!info->jited_ksyms) {
|
||||
free(info_linear);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* number of ksyms, func_lengths, and tags should match */
|
||||
sub_prog_cnt = info->nr_jited_ksyms;
|
||||
if (sub_prog_cnt != info->nr_prog_tags ||
|
||||
sub_prog_cnt != info->nr_jited_func_lens)
|
||||
sub_prog_cnt != info->nr_jited_func_lens) {
|
||||
free(info_linear);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check BTF func info support */
|
||||
if (info->btf_id && info->nr_func_info && info->func_info_rec_size) {
|
||||
/* btf func info number should be same as sub_prog_cnt */
|
||||
if (sub_prog_cnt != info->nr_func_info) {
|
||||
pr_debug("%s: mismatch in BPF sub program count and BTF function info count, aborting\n", __func__);
|
||||
err = -1;
|
||||
goto out;
|
||||
free(info_linear);
|
||||
return -1;
|
||||
}
|
||||
if (btf__get_from_id(info->btf_id, &btf)) {
|
||||
pr_debug("%s: failed to get BTF of id %u, aborting\n", __func__, info->btf_id);
|
||||
|
Loading…
Reference in New Issue
Block a user