fixing bug - possible overflow in overflow branch of FibonacciBackoff::Next

This commit is contained in:
William Dillon 2026-02-26 20:27:43 -05:00
parent 81979ef12d
commit c8bf4e5e2b

View File

@ -34,19 +34,22 @@ func (f *FibonacciBackoff) Next() time.Duration {
if multiplier <= 0 { if multiplier <= 0 {
multiplier = DefaultMultiplier multiplier = DefaultMultiplier
} }
pause := time.Duration(Fibonacci(f.Iteration)) var pause time.Duration
if product, overflows := utilities.ProductWouldOverflowInt64(pause.Nanoseconds(), multiplier.Nanoseconds()); overflows { for {
// cowardly refusal to overflow - return time.Duration(math.MaxInt64) pause = time.Duration(Fibonacci(f.Iteration))
// we can't calculate jitter, because that could overflow. if product, overflows := utilities.ProductWouldOverflowInt64(pause.Nanoseconds(), multiplier.Nanoseconds()); overflows {
// realistically, this should never happen, we're talking about almost 300 years. // cowardly refusal to overflow - decrement Iteration until multiplication is safe.
f.foundMax = f.Iteration - 1 // realistically, this should never happen, we're talking about almost 300 years.
f.Iteration = f.foundMax f.foundMax = f.Iteration - 1
pause = time.Duration(Fibonacci(f.Iteration)) * multiplier f.Iteration = f.foundMax
} else if f.MaxPause > 0 && time.Duration(product) > f.MaxPause { continue
f.foundMax = f.Iteration } else if f.MaxPause > 0 && time.Duration(product) > f.MaxPause {
pause = f.MaxPause f.foundMax = f.Iteration
} else { pause = f.MaxPause
pause = time.Duration(product) } else {
pause = time.Duration(product)
}
break
} }
// increment f.Iteration if appropriate // increment f.Iteration if appropriate