From 7fd7a393b6aebba9303efdbcd714ce84c1f8d5ab Mon Sep 17 00:00:00 2001 From: Julien <291750+roidelapluie@users.noreply.github.com> Date: Tue, 31 Mar 2026 14:23:17 +0200 Subject: [PATCH] convertnhcb: reject NaN bucket boundary in SetBucketCount (#18383) Signed-off-by: Julien Pivotto <291750+roidelapluie@users.noreply.github.com> --- util/convertnhcb/convertnhcb.go | 5 +++++ util/convertnhcb/convertnhcb_test.go | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/util/convertnhcb/convertnhcb.go b/util/convertnhcb/convertnhcb.go index 64ec9054a3..60d5414a4a 100644 --- a/util/convertnhcb/convertnhcb.go +++ b/util/convertnhcb/convertnhcb.go @@ -26,6 +26,7 @@ import ( var ( errNegativeBucketCount = errors.New("bucket count must be non-negative") + errNaNBucket = errors.New("bucket boundary must not be NaN") errNegativeCount = errors.New("count must be non-negative") errCountMismatch = errors.New("count mismatch") errCountNotCumulative = errors.New("count is not cumulative") @@ -71,6 +72,10 @@ func (h *TempHistogram) SetBucketCount(boundary, count float64) error { if h.err != nil { return h.err } + if math.IsNaN(boundary) { + h.err = errNaNBucket + return h.err + } if count < 0 { h.err = fmt.Errorf("%w: le=%g, count=%g", errNegativeBucketCount, boundary, count) return h.err diff --git a/util/convertnhcb/convertnhcb_test.go b/util/convertnhcb/convertnhcb_test.go index 710d47385a..3ec4b9cb0e 100644 --- a/util/convertnhcb/convertnhcb_test.go +++ b/util/convertnhcb/convertnhcb_test.go @@ -147,6 +147,19 @@ func TestNHCBConvert(t *testing.T) { }, expectedErr: errNegativeCount, }, + "NaN bucket upper bound": { + setup: func() *TempHistogram { + h := NewTempHistogram() + // Add a real bucket first so that the NaN call reaches the + // default branch of the switch in SetBucketCount; without an + // existing bucket, len(h.buckets)==0 and the NaN is silently + // appended without triggering the panic. + h.SetBucketCount(1.0, 5) + h.SetBucketCount(math.NaN(), 10) + return &h + }, + expectedErr: errNaNBucket, + }, "mixed order": { setup: func() *TempHistogram { h := NewTempHistogram()