Based on the following report from Smatch, fix the potential
NULL pointer dereference check.

  tools/perf/builtin-top.c:109
  perf_top__parse_source() warn: variable dereferenced before check 'he'
  (see line 103)

  tools/perf/builtin-top.c:233
  perf_top__show_details() warn: variable dereferenced before check 'he'
  (see line 228)

tools/perf/builtin-top.c
101 static int perf_top__parse_source(struct perf_top *top, struct hist_entry 
*he)
102 {
103         struct perf_evsel *evsel = hists_to_evsel(he->hists);
                                                      ^^^^
104         struct symbol *sym;
105         struct annotation *notes;
106         struct map *map;
107         int err = -1;
108
109         if (!he || !he->ms.sym)
110                 return -1;

This patch moves the values assignment after validating pointer 'he'.

Signed-off-by: Leo Yan <[email protected]>
---
 tools/perf/builtin-top.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 12b6b15a9675..13234c322981 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -100,7 +100,7 @@ static void perf_top__resize(struct perf_top *top)
 
 static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he)
 {
-       struct perf_evsel *evsel = hists_to_evsel(he->hists);
+       struct perf_evsel *evsel;
        struct symbol *sym;
        struct annotation *notes;
        struct map *map;
@@ -109,6 +109,8 @@ static int perf_top__parse_source(struct perf_top *top, 
struct hist_entry *he)
        if (!he || !he->ms.sym)
                return -1;
 
+       evsel = hists_to_evsel(he->hists);
+
        sym = he->ms.sym;
        map = he->ms.map;
 
@@ -225,7 +227,7 @@ static void perf_top__record_precise_ip(struct perf_top 
*top,
 static void perf_top__show_details(struct perf_top *top)
 {
        struct hist_entry *he = top->sym_filter_entry;
-       struct perf_evsel *evsel = hists_to_evsel(he->hists);
+       struct perf_evsel *evsel;
        struct annotation *notes;
        struct symbol *symbol;
        int more;
@@ -233,6 +235,8 @@ static void perf_top__show_details(struct perf_top *top)
        if (!he)
                return;
 
+       evsel = hists_to_evsel(he->hists);
+
        symbol = he->ms.sym;
        notes = symbol__annotation(symbol);
 
-- 
2.17.1

Reply via email to