Messages in this thread | | | From | Ian Rogers <> | Date | Fri, 23 Sep 2022 16:20:33 -0700 | Subject | Re: [PATCH 1/4] perf record: Fix a segfault in record__read_lost_samples() |
| |
On Fri, Sep 23, 2022 at 10:32 AM Namhyung Kim <namhyung@kernel.org> wrote: > > When it fails to open events record__open() returns without setting the > session->evlist. Then it gets a segfault in the function trying to read > lost sample counts. You can easily reproduce it as a normal user like: > > $ perf record -p 1 true > ... > perf: Segmentation fault > ... > > Skip the function if it has no evlist. And add more protection for evsels > which are not properly initialized. > > Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Ian Rogers <irogers@google.com>
Thanks, Ian
> --- > tools/perf/builtin-record.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c > index 741e763436ca..f4f1619199e5 100644 > --- a/tools/perf/builtin-record.c > +++ b/tools/perf/builtin-record.c > @@ -1888,6 +1888,10 @@ static void record__read_lost_samples(struct record *rec) > struct perf_record_lost_samples *lost; > struct evsel *evsel; > > + /* there was an error during record__open */ > + if (session->evlist == NULL) > + return; > + > lost = zalloc(PERF_SAMPLE_MAX_SIZE); > if (lost == NULL) { > pr_debug("Memory allocation failed\n"); > @@ -1899,6 +1903,8 @@ static void record__read_lost_samples(struct record *rec) > evlist__for_each_entry(session->evlist, evsel) { > struct xyarray *xy = evsel->core.sample_id; > > + if (xy == NULL || evsel->core.fd == NULL) > + continue; > if (xyarray__max_x(evsel->core.fd) != xyarray__max_x(xy) || > xyarray__max_y(evsel->core.fd) != xyarray__max_y(xy)) { > pr_debug("Unmatched FD vs. sample ID: skip reading LOST count\n"); > -- > 2.37.3.998.g577e59143f-goog >
| |