aboutsummaryrefslogtreecommitdiff
path: root/src/addrman.cpp
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@bitpay.com>2014-08-18 16:50:39 -0400
committerJeff Garzik <jgarzik@bitpay.com>2014-08-18 16:50:39 -0400
commit3a56de7fc318a45a7096cd318e2f2d7f8124ce24 (patch)
tree20c10f164c038a4d32f883ddfcecb7206fb55457 /src/addrman.cpp
parenta4f151f714d67da7850d94d44b824944d3f0d74d (diff)
downloadbitcoin-3a56de7fc318a45a7096cd318e2f2d7f8124ce24.tar.xz
addrman: Do not propagate obviously poor addresses onto the network
Diffstat (limited to 'src/addrman.cpp')
-rw-r--r--src/addrman.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/addrman.cpp b/src/addrman.cpp
index 3628af2eab..704766dbf8 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -492,17 +492,23 @@ int CAddrMan::Check_()
void CAddrMan::GetAddr_(std::vector<CAddress> &vAddr)
{
- int nNodes = ADDRMAN_GETADDR_MAX_PCT*vRandom.size()/100;
+ unsigned int nNodes = ADDRMAN_GETADDR_MAX_PCT * vRandom.size() / 100;
if (nNodes > ADDRMAN_GETADDR_MAX)
nNodes = ADDRMAN_GETADDR_MAX;
- // perform a random shuffle over the first nNodes elements of vRandom (selecting from all)
- for (int n = 0; n<nNodes; n++)
+ // gather a list of random nodes, skipping those of low quality
+ for (unsigned int n = 0; n < vRandom.size(); n++)
{
+ if (vAddr.size() >= nNodes)
+ break;
+
int nRndPos = GetRandInt(vRandom.size() - n) + n;
SwapRandom(n, nRndPos);
assert(mapInfo.count(vRandom[n]) == 1);
- vAddr.push_back(mapInfo[vRandom[n]]);
+
+ const CAddrInfo& ai = mapInfo[vRandom[n]];
+ if (!ai.IsTerrible())
+ vAddr.push_back(ai);
}
}