| From d3da71065dd81f9169074f2347ab99266d8cc0f9 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 12 Jun 2020 17:43:22 +0800 |
| Subject: perf report TUI: Fix segmentation fault in perf_evsel__hists_browse() |
| |
| From: Wei Li <liwei391@huawei.com> |
| |
| [ Upstream commit d61cbb859b45fdb6b4997f2d51834fae41af0e94 ] |
| |
| The segmentation fault can be reproduced as following steps: |
| |
| 1) Executing perf report in tui. |
| |
| 2) Typing '/xxxxx' to filter the symbol to get nothing matched. |
| |
| 3) Pressing enter with no entry selected. |
| |
| Then it will report a segmentation fault. |
| |
| It is caused by the lack of check of browser->he_selection when |
| accessing it's member res_samples in perf_evsel__hists_browse(). |
| |
| These processes are meaningful for specified samples, so we can skip |
| these when nothing is selected. |
| |
| Fixes: 4968ac8fb7c3 ("perf report: Implement browsing of individual samples") |
| Signed-off-by: Wei Li <liwei391@huawei.com> |
| Acked-by: Jiri Olsa <jolsa@redhat.com> |
| Acked-by: Namhyung Kim <namhyung@kernel.org> |
| Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Andi Kleen <ak@linux.intel.com> |
| Cc: Hanjun Guo <guohanjun@huawei.com> |
| Cc: Jin Yao <yao.jin@linux.intel.com> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Link: http://lore.kernel.org/lkml/20200612094322.39565-1-liwei391@huawei.com |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/perf/ui/browsers/hists.c | 17 +++++++++++------ |
| 1 file changed, 11 insertions(+), 6 deletions(-) |
| |
| diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c |
| index 88c3df24b748c..514cef3a17b40 100644 |
| --- a/tools/perf/ui/browsers/hists.c |
| +++ b/tools/perf/ui/browsers/hists.c |
| @@ -2224,6 +2224,11 @@ static struct thread *hist_browser__selected_thread(struct hist_browser *browser |
| return browser->he_selection->thread; |
| } |
| |
| +static struct res_sample *hist_browser__selected_res_sample(struct hist_browser *browser) |
| +{ |
| + return browser->he_selection ? browser->he_selection->res_samples : NULL; |
| +} |
| + |
| /* Check whether the browser is for 'top' or 'report' */ |
| static inline bool is_report_browser(void *timer) |
| { |
| @@ -3170,16 +3175,16 @@ static int perf_evsel__hists_browse(struct evsel *evsel, int nr_events, |
| &options[nr_options], NULL, NULL, evsel); |
| nr_options += add_res_sample_opt(browser, &actions[nr_options], |
| &options[nr_options], |
| - hist_browser__selected_entry(browser)->res_samples, |
| - evsel, A_NORMAL); |
| + hist_browser__selected_res_sample(browser), |
| + evsel, A_NORMAL); |
| nr_options += add_res_sample_opt(browser, &actions[nr_options], |
| &options[nr_options], |
| - hist_browser__selected_entry(browser)->res_samples, |
| - evsel, A_ASM); |
| + hist_browser__selected_res_sample(browser), |
| + evsel, A_ASM); |
| nr_options += add_res_sample_opt(browser, &actions[nr_options], |
| &options[nr_options], |
| - hist_browser__selected_entry(browser)->res_samples, |
| - evsel, A_SOURCE); |
| + hist_browser__selected_res_sample(browser), |
| + evsel, A_SOURCE); |
| nr_options += add_switch_opt(browser, &actions[nr_options], |
| &options[nr_options]); |
| skip_scripting: |
| -- |
| 2.25.1 |
| |