diff options
| author | Amol Yadav <amolyadav6125@gmail.com> | 2026-01-28 01:14:53 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2026-01-28 08:44:36 -0800 |
| commit | 6aef900af4eeb4a35d3ff1237a41cf3f63c56c24 (patch) | |
| tree | 9c22f0f5f3cda8642a709efc359bac46ab3e4785 /src/runtime/metrics | |
| parent | 026fa9dc597ea8e5280d7531ce7f193ed157cad0 (diff) | |
| download | go-6aef900af4eeb4a35d3ff1237a41cf3f63c56c24.tar.xz | |
runtime/metrics: fix panic in Read with empty slice
Calling Read with a nil or empty slice previously caused a panic with
"index out of range" because the function unconditionally accessed the
first element of the slice (via &m[0]) to pass the pointer to the
runtime.
This change adds a check for len(m) == 0 to return early, preventing
the panic when no samples are provided.
Fixes #77231
Change-Id: I442635f5c61de432883c8d0efae9cc6aa1363cc9
GitHub-Last-Rev: 6f24f67b18c77a0b36b92017a3f4ef8aa3aa5229
GitHub-Pull-Request: golang/go#77233
Reviewed-on: https://go-review.googlesource.com/c/go/+/737380
Reviewed-by: Amol Yadav <amolyadav6125@gmail.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Michael Pratt <mpratt@google.com>
Commit-Queue: Michael Pratt <mpratt@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Diffstat (limited to 'src/runtime/metrics')
| -rw-r--r-- | src/runtime/metrics/description_test.go | 7 | ||||
| -rw-r--r-- | src/runtime/metrics/sample.go | 3 |
2 files changed, 10 insertions, 0 deletions
diff --git a/src/runtime/metrics/description_test.go b/src/runtime/metrics/description_test.go index 0ee9ea16d0..71c7b00b02 100644 --- a/src/runtime/metrics/description_test.go +++ b/src/runtime/metrics/description_test.go @@ -156,3 +156,10 @@ func TestDocs(t *testing.T) { fmt.Fprintf(os.Stderr, "go test -generate: doc.go already up-to-date\n") } } + +func TestReadEmptySlice(t *testing.T) { + // Test that Read does not panic when given an empty slice. + // This should be a no-op. + metrics.Read(nil) + metrics.Read([]metrics.Sample{}) +} diff --git a/src/runtime/metrics/sample.go b/src/runtime/metrics/sample.go index 9efc5c5f06..df1341d48c 100644 --- a/src/runtime/metrics/sample.go +++ b/src/runtime/metrics/sample.go @@ -43,5 +43,8 @@ func runtime_readMetrics(unsafe.Pointer, int, int) // Sample values with names not appearing in [All] will have their Value populated // as KindBad to indicate that the name is unknown. func Read(m []Sample) { + if len(m) == 0 { + return + } runtime_readMetrics(unsafe.Pointer(&m[0]), len(m), cap(m)) } |
