perf machine: Avoid out of bounds LBR memory read
authorIan Rogers <irogers@google.com>
Tue, 24 Oct 2023 22:23:05 +0000 (15:23 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:59:29 +0000 (11:59 +0100)
[ Upstream commit ab8ce150781d326c6bfbe1e09f175ffde1186f80 ]

Running perf top with address sanitizer and "--call-graph=lbr" fails
due to reading sample 0 when no samples exist. Add a guard to prevent
this.

Fixes: e2b23483eb1d ("perf machine: Factor out lbr_callchain_add_lbr_ip()")
Signed-off-by: Ian Rogers <irogers@google.com>
Cc: K Prateek Nayak <kprateek.nayak@amd.com>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Sandipan Das <sandipan.das@amd.com>
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: German Gomez <german.gomez@arm.com>
Cc: James Clark <james.clark@arm.com>
Cc: Nick Terrell <terrelln@fb.com>
Cc: Sean Christopherson <seanjc@google.com>
Cc: Changbin Du <changbin.du@huawei.com>
Cc: liuwenyu <liuwenyu7@huawei.com>
Cc: Yang Jihong <yangjihong1@huawei.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Miguel Ojeda <ojeda@kernel.org>
Cc: Song Liu <song@kernel.org>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Yanteng Si <siyanteng@loongson.cn>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Link: https://lore.kernel.org/r/20231024222353.3024098-3-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/perf/util/machine.c

index 88f31b3..e6a8d75 100644 (file)
@@ -2624,16 +2624,18 @@ static int lbr_callchain_add_lbr_ip(struct thread *thread,
                save_lbr_cursor_node(thread, cursor, i);
        }
 
-       /* Add LBR ip from first entries.to */
-       ip = entries[0].to;
-       flags = &entries[0].flags;
-       *branch_from = entries[0].from;
-       err = add_callchain_ip(thread, cursor, parent,
-                              root_al, &cpumode, ip,
-                              true, flags, NULL,
-                              *branch_from);
-       if (err)
-               return err;
+       if (lbr_nr > 0) {
+               /* Add LBR ip from first entries.to */
+               ip = entries[0].to;
+               flags = &entries[0].flags;
+               *branch_from = entries[0].from;
+               err = add_callchain_ip(thread, cursor, parent,
+                               root_al, &cpumode, ip,
+                               true, flags, NULL,
+                               *branch_from);
+               if (err)
+                       return err;
+       }
 
        return 0;
 }