2023-05-05 20:56:17

by Ian Rogers

[permalink] [raw]
Subject: [PATCH v1] perf metrics: Fix segv with --for-each-cgroup

Ensure the metric threshold is copied correctly or else a use of
uninitialized memory happens.

Fixes: d0a3052f6fae ("perf metric: Compute and print threshold values")

Reported-by: Namhyung Kim <[email protected]>
Signed-off-by: Ian Rogers <[email protected]>
---
tools/perf/util/metricgroup.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
index 4b9a16291b96..c566c6859302 100644
--- a/tools/perf/util/metricgroup.c
+++ b/tools/perf/util/metricgroup.c
@@ -1730,6 +1730,7 @@ int metricgroup__copy_metric_events(struct evlist *evlist, struct cgroup *cgrp,
return -ENOMEM;

new_expr->metric_expr = old_expr->metric_expr;
+ new_expr->metric_threshold = old_expr->metric_threshold;
new_expr->metric_name = strdup(old_expr->metric_name);
if (!new_expr->metric_name)
return -ENOMEM;
--
2.40.1.521.gf1e218fcd8-goog


2023-05-05 21:20:38

by Namhyung Kim

[permalink] [raw]
Subject: Re: [PATCH v1] perf metrics: Fix segv with --for-each-cgroup

On Fri, May 5, 2023 at 1:41 PM Ian Rogers <[email protected]> wrote:
>
> Ensure the metric threshold is copied correctly or else a use of
> uninitialized memory happens.
>
> Fixes: d0a3052f6fae ("perf metric: Compute and print threshold values")
>
> Reported-by: Namhyung Kim <[email protected]>
> Signed-off-by: Ian Rogers <[email protected]>

Thanks for the fix. Now it runs ok

$ sudo ./perf stat -a --bpf-counters \
> --for-each-cgroup user.slice,system.slice sleep 1

Tested-by: Namhyung Kim <[email protected]>

Thanks,
Namhyung


> ---
> tools/perf/util/metricgroup.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
> index 4b9a16291b96..c566c6859302 100644
> --- a/tools/perf/util/metricgroup.c
> +++ b/tools/perf/util/metricgroup.c
> @@ -1730,6 +1730,7 @@ int metricgroup__copy_metric_events(struct evlist *evlist, struct cgroup *cgrp,
> return -ENOMEM;
>
> new_expr->metric_expr = old_expr->metric_expr;
> + new_expr->metric_threshold = old_expr->metric_threshold;
> new_expr->metric_name = strdup(old_expr->metric_name);
> if (!new_expr->metric_name)
> return -ENOMEM;
> --
> 2.40.1.521.gf1e218fcd8-goog
>