diff --git a/server/channels/utils/random.go b/server/channels/utils/random.go index 199f8f27dc2..e0a0002c222 100644 --- a/server/channels/utils/random.go +++ b/server/channels/utils/random.go @@ -17,8 +17,13 @@ func RandIntFromRange(r Range) int { if r.End-r.Begin <= 0 { return r.Begin } - max := int64((r.End - r.Begin) + 1) - n, err := rand.Int(rand.Reader, big.NewInt(max)) + // Use big.Int for span calculation to avoid arithmetic overflow + begin := big.NewInt(int64(r.Begin)) + end := big.NewInt(int64(r.End)) + max := new(big.Int).Sub(end, begin) + max.Add(max, big.NewInt(1)) + + n, err := rand.Int(rand.Reader, max) if err != nil { // Fallback to begin value if crypto/rand fails (rare) return r.Begin