Re: [PATCH 1/2] perf parse-events: Fix segfault when event parser gets an error

From: Ian Rogers
Date: Mon Jul 18 2022 - 21:10:42 EST


On Tue, Jul 12, 2022 at 4:28 AM Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote:
>
> parse_events() is often called with parse_events_error set to NULL.
> Make parse_events_error__handle() not segfault in that case.
>
> Fixes: 43eb05d06679 ("perf tests: Support 'Track with sched_switch' test for hybrid")
> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>
> ---
> tools/perf/util/parse-events.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index 7ed235740431..700c95eafd62 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -2391,9 +2391,12 @@ void parse_events_error__exit(struct parse_events_error *err)
> void parse_events_error__handle(struct parse_events_error *err, int idx,
> char *str, char *help)
> {
> - if (WARN(!str, "WARNING: failed to provide error string\n")) {
> - free(help);
> - return;
> + if (WARN(!str, "WARNING: failed to provide error string\n"))
> + goto out_free;
> + if (!err) {
> + /* Assume caller does not want message printed */
> + pr_debug("event syntax error: %s\n", str);
> + goto out_free;


It feels like a simpler invariant (as done elsewhere) to have the
caller always pass err and then in the caller to call
parse_events_error__exit. Any reason for behavior change?

Thanks,
Ian

> }
> switch (err->num_errors) {
> case 0:
> @@ -2419,6 +2422,11 @@ void parse_events_error__handle(struct parse_events_error *err, int idx,
> break;
> }
> err->num_errors++;
> + return;
> +
> +out_free:
> + free(str);
> + free(help);
> }
>
> #define MAX_WIDTH 1000
> --
> 2.25.1
>