diff options
| author | Weixie Cui <cuiweixie@gmail.com> | 2026-04-07 13:07:54 +0000 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2026-04-13 09:18:34 -0700 |
| commit | f2d1ef98bef27ffad398d2cc435439a0f08b998e (patch) | |
| tree | 17ab9397c6b1529c4046e9a50423ab388773cfb5 /src/cmd | |
| parent | a27cd987811c50f44fae1a97a45fef8ff39efa1f (diff) | |
| download | go-f2d1ef98bef27ffad398d2cc435439a0f08b998e.tar.xz | |
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 <lehner.florian86@gmail.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/cmd')
| -rw-r--r-- | src/cmd/trace/pprof.go | 2 | ||||
| -rw-r--r-- | src/cmd/trace/pprof_test.go | 26 |
2 files changed, 27 insertions, 1 deletions
diff --git a/src/cmd/trace/pprof.go b/src/cmd/trace/pprof.go index b472ffa759..f1ab959fa7 100644 --- a/src/cmd/trace/pprof.go +++ b/src/cmd/trace/pprof.go @@ -320,9 +320,9 @@ func (m *stackMap) profile() []traceviewer.ProfileRecord { // pcsForStack extracts the first pprofMaxStack PCs from stack into pcs. func pcsForStack(stack trace.Stack, pcs *[pprofMaxStack]uint64) { for i, frame := range slices.Collect(stack.Frames()) { - pcs[i] = frame.PC if i >= len(pcs) { break } + pcs[i] = frame.PC } } 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 { |
