From f2d1ef98bef27ffad398d2cc435439a0f08b998e Mon Sep 17 00:00:00 2001 From: Weixie Cui Date: Tue, 7 Apr 2026 13:07:54 +0000 Subject: cmd/trace: pcs overflow would panic Fixes #78538 Change-Id: I4bf9add8eab7785504a366331f9ec7c0fb1ca40e GitHub-Last-Rev: 8f3389dd5ac37ea5d7584036c90c353d2d64d7a5 GitHub-Pull-Request: golang/go#78539 Reviewed-on: https://go-review.googlesource.com/c/go/+/762960 Reviewed-by: Florian Lehner Reviewed-by: Michael Knyszek Reviewed-by: David Chase LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com --- src/cmd/trace/pprof_test.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/cmd/trace/pprof_test.go') diff --git a/src/cmd/trace/pprof_test.go b/src/cmd/trace/pprof_test.go index 6d18e7d5d1..ec5bbd6816 100644 --- a/src/cmd/trace/pprof_test.go +++ b/src/cmd/trace/pprof_test.go @@ -14,6 +14,7 @@ import ( "testing/synctest" "time" + itrace "internal/trace" "internal/trace/testtrace" ) @@ -81,6 +82,31 @@ func TestSyscallProfile74850(t *testing.T) { } } +// Regression test: pcsForStack must not panic when the stack has more than +// pprofMaxStack (128) frames. Before the fix, pcs[i] was written before +// checking i >= len(pcs), causing an index-out-of-range panic. +func TestFillPCsOverflow(t *testing.T) { + var pcs [pprofMaxStack]uint64 + + // Build a stack with more frames than pprofMaxStack. + n := pprofMaxStack + 10 + frames := make([]itrace.StackFrame, n) + for i := range frames { + frames[i].PC = uint64(0x1000 + i) + } + stack := itrace.MakeStack(frames) + + // This must not panic. + pcsForStack(stack, &pcs) + + // Verify the first pprofMaxStack entries were written correctly. + for i := 0; i < pprofMaxStack; i++ { + if pcs[i] != uint64(0x1000+i) { + t.Errorf("pcs[%d] = %#x, want %#x", i, pcs[i], 0x1000+i) + } + } +} + func stat(t *testing.T) { _, err := os.Stat(".") if err != nil { -- cgit v1.3