Messages in this thread Patch in this message | | | From | Kaige Ye <> | Subject | [PATCH v2] perf stat-display: Check if snprintf()'s fmt argument is NULL | Date | Fri, 4 Aug 2023 10:09:08 +0800 |
| |
It is undefined behavior to pass NULL as snprintf()'s fmt argument. Here is an example to trigger the problem:
$ perf stat --metric-only -x, -e instructions -- sleep 1 insn per cycle, Segmentation fault (core dumped)
With this patch:
$ perf stat --metric-only -x, -e instructions -- sleep 1 insn per cycle, ,
Signed-off-by: Kaige Ye <ye@kaige.org> --- V1 -> V2: Addressed Ian's comments (Ian Rogers) --- tools/perf/util/stat-display.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index 7329b3340..031888545 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -578,7 +578,7 @@ static void print_metric_only_csv(struct perf_stat_config *config __maybe_unused if (!valid_only_metric(unit)) return; unit = fixunit(tbuf, os->evsel, unit); - snprintf(buf, sizeof buf, fmt, val); + snprintf(buf, sizeof(buf), fmt ?: "", val); ends = vals = skip_spaces(buf); while (isdigit(*ends) || *ends == '.') ends++; @@ -600,7 +600,7 @@ static void print_metric_only_json(struct perf_stat_config *config __maybe_unuse if (!valid_only_metric(unit)) return; unit = fixunit(tbuf, os->evsel, unit); - snprintf(buf, sizeof(buf), fmt, val); + snprintf(buf, sizeof(buf), fmt ?: "", val); ends = vals = skip_spaces(buf); while (isdigit(*ends) || *ends == '.') ends++; base-commit: f6b8436bede3e80226e8b2100279c4450c73806a -- 2.41.0
| |