From c8bf4e5e2b5a536fb528df0a1ec20eac8a8c5068 Mon Sep 17 00:00:00 2001 From: William Dillon Date: Thu, 26 Feb 2026 20:27:43 -0500 Subject: [PATCH] fixing bug - possible overflow in overflow branch of FibonacciBackoff::Next --- fibonacci/fibonacci.go | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/fibonacci/fibonacci.go b/fibonacci/fibonacci.go index b790bfe..904066d 100644 --- a/fibonacci/fibonacci.go +++ b/fibonacci/fibonacci.go @@ -34,19 +34,22 @@ func (f *FibonacciBackoff) Next() time.Duration { if multiplier <= 0 { multiplier = DefaultMultiplier } - pause := time.Duration(Fibonacci(f.Iteration)) - if product, overflows := utilities.ProductWouldOverflowInt64(pause.Nanoseconds(), multiplier.Nanoseconds()); overflows { - // cowardly refusal to overflow - return time.Duration(math.MaxInt64) - // we can't calculate jitter, because that could overflow. - // realistically, this should never happen, we're talking about almost 300 years. - f.foundMax = f.Iteration - 1 - f.Iteration = f.foundMax - pause = time.Duration(Fibonacci(f.Iteration)) * multiplier - } else if f.MaxPause > 0 && time.Duration(product) > f.MaxPause { - f.foundMax = f.Iteration - pause = f.MaxPause - } else { - pause = time.Duration(product) + var pause time.Duration + for { + pause = time.Duration(Fibonacci(f.Iteration)) + if product, overflows := utilities.ProductWouldOverflowInt64(pause.Nanoseconds(), multiplier.Nanoseconds()); overflows { + // cowardly refusal to overflow - decrement Iteration until multiplication is safe. + // realistically, this should never happen, we're talking about almost 300 years. + f.foundMax = f.Iteration - 1 + f.Iteration = f.foundMax + continue + } else if f.MaxPause > 0 && time.Duration(product) > f.MaxPause { + f.foundMax = f.Iteration + pause = f.MaxPause + } else { + pause = time.Duration(product) + } + break } // increment f.Iteration if appropriate