Skip to content

Commit e862564

Browse files
committed
Make addrman use its local RNG exclusively
1 parent 94b2ead commit e862564

File tree

3 files changed

+12
-25
lines changed

3 files changed

+12
-25
lines changed

src/addrman.cpp

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ void CAddrMan::Good_(const CService& addr, bool test_before_evict, int64_t nTime
219219
return;
220220

221221
// find a bucket it is in now
222-
int nRnd = RandomInt(ADDRMAN_NEW_BUCKET_COUNT);
222+
int nRnd = insecure_rand.randrange(ADDRMAN_NEW_BUCKET_COUNT);
223223
int nUBucket = -1;
224224
for (unsigned int n = 0; n < ADDRMAN_NEW_BUCKET_COUNT; n++) {
225225
int nB = (n + nRnd) % ADDRMAN_NEW_BUCKET_COUNT;
@@ -295,7 +295,7 @@ bool CAddrMan::Add_(const CAddress& addr, const CNetAddr& source, int64_t nTimeP
295295
int nFactor = 1;
296296
for (int n = 0; n < pinfo->nRefCount; n++)
297297
nFactor *= 2;
298-
if (nFactor > 1 && (RandomInt(nFactor) != 0))
298+
if (nFactor > 1 && (insecure_rand.randrange(nFactor) != 0))
299299
return false;
300300
} else {
301301
pinfo = Create(addr, source, &nId);
@@ -359,37 +359,37 @@ CAddrInfo CAddrMan::Select_(bool newOnly)
359359
return CAddrInfo();
360360

361361
// Use a 50% chance for choosing between tried and new table entries.
362-
if (!newOnly && (nTried > 0 && (nNew == 0 || RandomInt(2) == 0))) {
362+
if (!newOnly && (nTried > 0 && (nNew == 0 || insecure_rand.randbool() == 0))) {
363363
// use a tried node
364364
double fChanceFactor = 1.0;
365365
while (1) {
366-
int nKBucket = RandomInt(ADDRMAN_TRIED_BUCKET_COUNT);
367-
int nKBucketPos = RandomInt(ADDRMAN_BUCKET_SIZE);
366+
int nKBucket = insecure_rand.randrange(ADDRMAN_TRIED_BUCKET_COUNT);
367+
int nKBucketPos = insecure_rand.randrange(ADDRMAN_BUCKET_SIZE);
368368
while (vvTried[nKBucket][nKBucketPos] == -1) {
369369
nKBucket = (nKBucket + insecure_rand.randbits(ADDRMAN_TRIED_BUCKET_COUNT_LOG2)) % ADDRMAN_TRIED_BUCKET_COUNT;
370370
nKBucketPos = (nKBucketPos + insecure_rand.randbits(ADDRMAN_BUCKET_SIZE_LOG2)) % ADDRMAN_BUCKET_SIZE;
371371
}
372372
int nId = vvTried[nKBucket][nKBucketPos];
373373
assert(mapInfo.count(nId) == 1);
374374
CAddrInfo& info = mapInfo[nId];
375-
if (RandomInt(1 << 30) < fChanceFactor * info.GetChance() * (1 << 30))
375+
if (insecure_rand.randbits(30) < fChanceFactor * info.GetChance() * (1 << 30))
376376
return info;
377377
fChanceFactor *= 1.2;
378378
}
379379
} else {
380380
// use a new node
381381
double fChanceFactor = 1.0;
382382
while (1) {
383-
int nUBucket = RandomInt(ADDRMAN_NEW_BUCKET_COUNT);
384-
int nUBucketPos = RandomInt(ADDRMAN_BUCKET_SIZE);
383+
int nUBucket = insecure_rand.randrange(ADDRMAN_NEW_BUCKET_COUNT);
384+
int nUBucketPos = insecure_rand.randrange(ADDRMAN_BUCKET_SIZE);
385385
while (vvNew[nUBucket][nUBucketPos] == -1) {
386386
nUBucket = (nUBucket + insecure_rand.randbits(ADDRMAN_NEW_BUCKET_COUNT_LOG2)) % ADDRMAN_NEW_BUCKET_COUNT;
387387
nUBucketPos = (nUBucketPos + insecure_rand.randbits(ADDRMAN_BUCKET_SIZE_LOG2)) % ADDRMAN_BUCKET_SIZE;
388388
}
389389
int nId = vvNew[nUBucket][nUBucketPos];
390390
assert(mapInfo.count(nId) == 1);
391391
CAddrInfo& info = mapInfo[nId];
392-
if (RandomInt(1 << 30) < fChanceFactor * info.GetChance() * (1 << 30))
392+
if (insecure_rand.randbits(30) < fChanceFactor * info.GetChance() * (1 << 30))
393393
return info;
394394
fChanceFactor *= 1.2;
395395
}
@@ -485,7 +485,7 @@ void CAddrMan::GetAddr_(std::vector<CAddress>& vAddr)
485485
if (vAddr.size() >= nNodes)
486486
break;
487487

488-
int nRndPos = RandomInt(vRandom.size() - n) + n;
488+
int nRndPos = insecure_rand.randrange(vRandom.size() - n) + n;
489489
SwapRandom(n, nRndPos);
490490
assert(mapInfo.count(vRandom[n]) == 1);
491491

@@ -533,10 +533,6 @@ void CAddrMan::SetServices_(const CService& addr, ServiceFlags nServices)
533533
info.nServices = nServices;
534534
}
535535

536-
int CAddrMan::RandomInt(int nMax){
537-
return GetRandInt(nMax);
538-
}
539-
540536
void CAddrMan::ResolveCollisions_()
541537
{
542538
for (std::set<int>::iterator it = m_tried_collisions.begin(); it != m_tried_collisions.end();) {
@@ -603,7 +599,7 @@ CAddrInfo CAddrMan::SelectTriedCollision_()
603599
std::set<int>::iterator it = m_tried_collisions.begin();
604600

605601
// Selects a random element from m_tried_collisions
606-
std::advance(it, GetRandInt(m_tried_collisions.size()));
602+
std::advance(it, insecure_rand.randrange(m_tried_collisions.size()));
607603
int id_new = *it;
608604

609605
// If id_new not found in mapInfo remove it from m_tried_collisions

src/addrman.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,6 @@ class CAddrMan
269269
//! Return a random to-be-evicted tried table address.
270270
CAddrInfo SelectTriedCollision_() EXCLUSIVE_LOCKS_REQUIRED(cs);
271271

272-
//! Wraps GetRandInt to allow tests to override RandomInt and make it determinismistic.
273-
virtual int RandomInt(int nMax);
274-
275272
#ifdef DEBUG_ADDRMAN
276273
//! Perform consistency check. Returns an error code or zero.
277274
int Check_() EXCLUSIVE_LOCKS_REQUIRED(cs);
@@ -469,7 +466,7 @@ class CAddrMan
469466
{
470467
LOCK(cs);
471468
std::vector<int>().swap(vRandom);
472-
nKey = GetRandHash();
469+
nKey = insecure_rand.rand256();
473470
for (size_t bucket = 0; bucket < ADDRMAN_NEW_BUCKET_COUNT; bucket++) {
474471
for (size_t entry = 0; entry < ADDRMAN_BUCKET_SIZE; entry++) {
475472
vvNew[bucket][entry] = -1;

src/test/addrman_tests.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,6 @@ class CAddrManTest : public CAddrMan
2929
insecure_rand = FastRandomContext(true);
3030
}
3131

32-
int RandomInt(int nMax)
33-
{
34-
state = ReadLE64((CHashWriter(SER_GETHASH, 0) << state).GetHash().begin());
35-
return (unsigned int)(state % nMax);
36-
}
37-
3832
CAddrInfo* Find(const CNetAddr& addr, int* pnId = NULL)
3933
{
4034
LOCK(cs);

0 commit comments

Comments
 (0)