Re: [PATCH v3] perf data convert: Fix segfault when converting to json on arm64

From: Ilkka Koskinen
Date: Fri Feb 23 2024 - 15:26:31 EST




On Fri, 23 Feb 2024, Namhyung Kim wrote:
Hello,

On Thu, Feb 22, 2024 at 1:42 PM Ilkka Koskinen
<ilkka@xxxxxxxxxxxxxxxxxxxxxx> wrote:


cc: Evgeny Pistun since he submitted a patch pretty similar to my first
version
(https://lore.kernel.org/all/20240125184411.30757-1-kotborealis@xxxxxxxx/)



Namhyung and James,

What's your thought on this? Is one of the patches (Evgeny's or mine)
good enough or should we try some other approach?

Sorry for the long delay. Please see my comments below.



On Wed, 17 Jan 2024, Ilkka Koskinen wrote:
Arm64 doesn't have Model in /proc/cpuinfo and, thus, cpu_desc doesn't get
assigned.

Running
$ perf data convert --to-json perf.data.json

ends up calling output_json_string() with NULL pointer, which causes a
segmentation fault.

Signed-off-by: Ilkka Koskinen <ilkka@xxxxxxxxxxxxxxxxxxxxxx>
---
v1:
- https://lore.kernel.org/all/20240111232923.8138-1-ilkka@xxxxxxxxxxxxxxxxxxxxxx/
v2:
- Changed the patch based on James's comments.
v3:
- The architecture is checked from the actual data file to allow one to do
conversion on another system. (thanks to James for the feedback)
---
tools/perf/util/data-convert-json.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-convert-json.c
index 5bb3c2ba95ca..405c38371870 100644
--- a/tools/perf/util/data-convert-json.c
+++ b/tools/perf/util/data-convert-json.c
@@ -284,7 +284,13 @@ static void output_headers(struct perf_session *session, struct convert_json *c)
output_json_key_string(out, true, 2, "os-release", header->env.os_release);
output_json_key_string(out, true, 2, "arch", header->env.arch);

- output_json_key_string(out, true, 2, "cpu-desc", header->env.cpu_desc);
+ /*
+ * Arm64 doesn't have Model section in /proc/cpuinfo and, thus, cpu-desc
+ * is not set.
+ */
+ if (strncmp(header->env.arch, "aarch64", 7))
+ output_json_key_string(out, true, 2, "cpu-desc", header->env.cpu_desc);

I prefer checking cpu_desc (if it's NULL) not the arch string.
Maybe other arch has the same problem or can introduce one later..

Sounds reasonable. I'll submit a new version soon

Cheers, Ilkka




Thanks,
Namhyung

+
output_json_key_string(out, true, 2, "cpuid", header->env.cpuid);
output_json_key_format(out, true, 2, "nrcpus-online", "%u", header->env.nr_cpus_online);
output_json_key_format(out, true, 2, "nrcpus-avail", "%u", header->env.nr_cpus_avail);
--
2.43.0