Skip to content

Commit 5040a65

Browse files
error on rand fail
1 parent f01b4bf commit 5040a65

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

network/peer_tracker.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,13 @@ func (p *peerTracker) shouldTrackNewPeer() bool {
7777
return false
7878
}
7979
newPeerProbability := math.Exp(-float64(numResponsivePeers) * newPeerConnectFactor)
80-
return rand.SecureFloat64() < newPeerProbability
80+
randomValue, err := rand.SecureFloat64()
81+
if err != nil {
82+
log.Error("failed to generate secure random number for peer tracking", "err", err)
83+
// Fallback to conservative behavior - don't track new peer
84+
return false
85+
}
86+
return randomValue < newPeerProbability
8187
}
8288

8389
// getResponsivePeer returns a random [ids.NodeID] of a peer that has responded
@@ -116,7 +122,12 @@ func (p *peerTracker) GetAnyPeer(minVersion *version.Application) (ids.NodeID, b
116122
random bool
117123
averager safemath.Averager
118124
)
119-
if rand.SecureFloat64() < randomPeerProbability {
125+
randomValue, err := rand.SecureFloat64()
126+
if err != nil {
127+
log.Error("failed to generate secure random number for peer selection", "err", err)
128+
// Fallback to deterministic behavior - use bandwidth heap
129+
nodeID, averager, ok = p.bandwidthHeap.Pop()
130+
} else if randomValue < randomPeerProbability {
120131
random = true
121132
nodeID, averager, ok = p.getResponsivePeer()
122133
} else {

utils/rand/rand.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,20 @@ import (
1313

1414
// Intn is a shortcut for generating a random integer between 0 and
1515
// n using crypto/rand.
16-
func Intn(n int64) int64 {
16+
func Intn(n int64) (int64, error) {
1717
nBig, err := rand.Int(rand.Reader, big.NewInt(n))
1818
if err != nil {
19-
panic(err)
19+
return 0, err
2020
}
21-
return nBig.Int64()
21+
return nBig.Int64(), nil
2222
}
2323

2424
// SecureFloat64 is a shortcut for generating a random float between 0 and
2525
// 1 using crypto/rand.
26-
func SecureFloat64() float64 {
27-
return float64(Intn(1<<53)) / (1 << 53)
26+
func SecureFloat64() (float64, error) {
27+
n, err := Intn(1 << 53)
28+
if err != nil {
29+
return 0, err
30+
}
31+
return float64(n) / (1 << 53), nil
2832
}

0 commit comments

Comments
 (0)