[PATCH v6 06/26] perf trace: Copy sockaddr arguments by their length
From: Ian Rogers
Date: Mon Sep 28 2026 - 14:34:57 EST
The BTF augmenter copies sizeof(struct sockaddr), 16 bytes, for the
sockaddr arguments of connect, bind and sendto, and runs before the
sys_enter_connect and sys_enter_sendto programs that copy their length.
An IPv6 address needs 24 or 28 bytes, so the rest was read from past the
payload, and now that the printers are bounded only its family is shown.
Copy them as buffers sized by the length argument after them, up to the
32 bytes augmented buffers are limited to. That holds an IPv6 address
and doubles the AF_LOCAL path shown.
Fixes: a68fd6a6cdd3 ("perf trace: Collect augmented data using BPF")
Assisted-by: Antigravity:gemini-3.1-pro
Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
---
tools/perf/builtin-trace.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 85db74965280..f94745a60f4a 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -4159,7 +4159,12 @@ static int trace__bpf_sys_enter_beauty_map(struct trace *trace, int e_machine, i
continue;
bt = sc->arg_fmt[i].type;
- beauty_array[i] = bt->size;
+ /* Copy a sockaddr as a buffer sized by the next argument, e.g. addrlen. */
+ if (strcmp(name, "sockaddr") == 0 && field->next &&
+ strstr(field->next->name, "len"))
+ beauty_array[i] = -((i + 1) + 1);
+ else
+ beauty_array[i] = bt->size;
can_augment = true;
} else if (field->flags & TEP_FIELD_IS_POINTER && /* string */
strcmp(field->type, "const char *") == 0 &&
--
2.56.0.rc1.315.gc6ed9934b7-goog