[Patch v2 1/2] perf aslr: Add missing SIMD handling in aslr_tool__process_sample()
From: Dapeng Mi <hidden>
Date: 2026-09-22 01:12:30
Currently the SIMD register sampling is supported, but the corresponding handling is missed in aslr_tool__process_sample(). This can break parsing of the sample record. Add the missing SIMD register handling in aslr_tool__process_sample(). Signed-off-by: Dapeng Mi <redacted> Reviewed-by: Ian Rogers <irogers@google.com> --- V2: Add missed "#undef CHECK_SIMD" and fix typo in short log (Ian). tools/perf/util/aslr.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
diff --git a/tools/perf/util/aslr.c b/tools/perf/util/aslr.c
index 027695d96779..697ac0d3d548 100644
--- a/tools/perf/util/aslr.c
+++ b/tools/perf/util/aslr.c@@ -19,6 +19,7 @@ #include <internal/lib.h> /* page_size */ #include <linux/compiler.h> #include <linux/zalloc.h> +#include <linux/overflow.h> #include <errno.h> #include <inttypes.h> #include <unistd.h>
@@ -992,6 +993,34 @@ static int aslr_tool__process_sample(const struct perf_tool *tool, COPY_U64(); } } + +#define CHECK_SIMD() \ + do { \ + if (abi & PERF_SAMPLE_REGS_ABI_SIMD) { \ + u64 nr_vector, vec_qwords; \ + u64 nr_pred, pred_qwords; \ + u64 header_len, vec_len, pred_len, simd_len; \ + if (CHECK_BOUNDS(nr + 4, nr + 4)) { \ + ret = -EFAULT; \ + goto out_put; \ + } \ + header_len = 4; \ + nr_vector = in_array[i + nr]; \ + vec_qwords = in_array[i + nr + 1]; \ + nr_pred = in_array[i + nr + 2]; \ + pred_qwords = in_array[i + nr + 3]; \ + if (check_mul_overflow(nr_vector, vec_qwords, &vec_len) || \ + check_mul_overflow(nr_pred, pred_qwords, &pred_len) || \ + check_add_overflow(vec_len, pred_len, &simd_len) || \ + check_add_overflow(header_len, simd_len, &simd_len) || \ + check_add_overflow(nr, simd_len, &nr) || \ + nr > max_i - i) { \ + ret = -EFAULT; \ + goto out_put; \ + } \ + } \ + } while (0) + if (orig_sample_type & PERF_SAMPLE_REGS_USER) { u64 abi;
@@ -1007,6 +1036,7 @@ static int aslr_tool__process_sample(const struct perf_tool *tool, ret = -EFAULT; goto out_put; } + CHECK_SIMD(); i += nr; } }
@@ -1061,6 +1091,7 @@ static int aslr_tool__process_sample(const struct perf_tool *tool, ret = -EFAULT; goto out_put; } + CHECK_SIMD(); i += nr; } }
@@ -1154,6 +1185,7 @@ static int aslr_tool__process_sample(const struct perf_tool *tool, #undef CHECK_BOUNDS #undef COPY_U64 #undef REMAP_U64 +#undef CHECK_SIMD static int skipn(int fd, off_t n) {
base-commit: 1c12f13c079c35a1e5ef2dd9e6aeea1810c58e87 -- 2.34.1