perf: arm-spe: Fix null-ptr-deref in arm_spe__alloc_metadata()
Subsystems (2)
PATCH 1/1 perf: arm-spe: Fix null-ptr-deref in arm_spe__alloc_metadata()
When metadata is allocated using arm_spe__alloc_metadata(), if the metadata version is 1, metadata is returned as NULL. This value is dereferenced later in arm_spe__free_metadata() and it can cause null-ptr-deref.
Modify the NULL check for metadata to return -EINVAL even when metadata_ver == 1.
This issue was reported by Coverity scan [1].
[1] https://scan5.scan.coverity.com/#/project-view/63616/10063?selectedIssue=1636359
--- tools/perf/util/arm-spe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/arm-spe.c +1 -1
@@ -1497,7 +1497,7 @@ int arm_spe_process_auxtrace_info(union perf_event *event, metadata =arm_spe__alloc_metadata (auxtrace_info, &metadata_ver, &nr_cpu); -if (!metadata && metadata_ver !=1 ) { +if (!metadata) {pr_err ("Failed to parse Arm SPE metadata.\n" );return -EINVAL ; }
Signature · 1 line
2.34.1
James Clark
reviewerQuoted 8 lines · Nihar Chaithanya
When metadata is allocated using
arm_spe__alloc_metadata(), if the metadata version is 1, metadata is returned as NULL. This value is dereferenced later inarm_spe__free_metadata()and it can cause null-ptr-deref.Modify the NULL check for metadata to return
-EINVALeven whenmetadata_ver== 1.
Hi Nihar,
I don't think this is the right fix. Doesn't that mean we can't open files with V1 anymore? Did you test opening an old SPE file on a new version of Perf? I actually thought I tested this before but maybe not if there's a NULL deref.
Seems like the correct fix is to not dereference anything if metadata is NULL, or make a fake placeholder one.
Quoted 3 lines
This issue was reported by Coverity scan [1].
[1] https://scan5.scan.coverity.com/#/project-view/63616/10063?selectedIssue=1636359
Is this supposed to be publicly accessible? It goes to a login page for me.
Quoted 2 lines
Probably needs a fixes: tag too for the commit that introduced the issue.
Thanks
James
Quoted 17 lines
--- tools/perf/util/arm-spe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)tools/perf/util/arm-spe.c +1
-1@@ -1497,7 +1497,7 @@ int arm_spe_process_auxtrace_info(union perf_event *event, metadata =arm_spe__alloc_metadata (auxtrace_info, &metadata_ver, &nr_cpu); -if (!metadata && metadata_ver !=1 ) { +if (!metadata) {pr_err ("Failed to parse Arm SPE metadata.\n" );return -EINVAL ; }