net: don't send any messages before handshake or after requested disconnect
Also, send reject messages earlier in SendMessages(), so that disconnections are processed earlier. These changes combined should ensure that no message is ever sent after fDisconnect is set.
This commit is contained in:
parent
d74e352e01
commit
fedea8a14d
1 changed files with 25 additions and 21 deletions
46
src/main.cpp
46
src/main.cpp
|
@ -6512,7 +6512,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
|
||||||
const Consensus::Params& consensusParams = Params().GetConsensus();
|
const Consensus::Params& consensusParams = Params().GetConsensus();
|
||||||
{
|
{
|
||||||
// Don't send anything until we get its version message
|
// Don't send anything until we get its version message
|
||||||
if (pto->nVersion == 0)
|
if (pto->nVersion == 0 || pto->fDisconnect)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -6548,6 +6548,28 @@ bool SendMessages(CNode* pto, CConnman& connman)
|
||||||
if (!lockMain)
|
if (!lockMain)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
CNodeState &state = *State(pto->GetId());
|
||||||
|
|
||||||
|
BOOST_FOREACH(const CBlockReject& reject, state.rejects)
|
||||||
|
connman.PushMessage(pto, NetMsgType::REJECT, (string)NetMsgType::BLOCK, reject.chRejectCode, reject.strRejectReason, reject.hashBlock);
|
||||||
|
state.rejects.clear();
|
||||||
|
|
||||||
|
if (state.fShouldBan) {
|
||||||
|
state.fShouldBan = false;
|
||||||
|
if (pto->fWhitelisted)
|
||||||
|
LogPrintf("Warning: not punishing whitelisted peer %s!\n", pto->addr.ToString());
|
||||||
|
else {
|
||||||
|
pto->fDisconnect = true;
|
||||||
|
if (pto->addr.IsLocal())
|
||||||
|
LogPrintf("Warning: not banning local peer %s!\n", pto->addr.ToString());
|
||||||
|
else
|
||||||
|
{
|
||||||
|
connman.Ban(pto->addr, BanReasonNodeMisbehaving);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Address refresh broadcast
|
// Address refresh broadcast
|
||||||
int64_t nNow = GetTimeMicros();
|
int64_t nNow = GetTimeMicros();
|
||||||
if (!IsInitialBlockDownload() && pto->nNextLocalAddrSend < nNow) {
|
if (!IsInitialBlockDownload() && pto->nNextLocalAddrSend < nNow) {
|
||||||
|
@ -6584,26 +6606,6 @@ bool SendMessages(CNode* pto, CConnman& connman)
|
||||||
pto->vAddrToSend.shrink_to_fit();
|
pto->vAddrToSend.shrink_to_fit();
|
||||||
}
|
}
|
||||||
|
|
||||||
CNodeState &state = *State(pto->GetId());
|
|
||||||
if (state.fShouldBan) {
|
|
||||||
if (pto->fWhitelisted)
|
|
||||||
LogPrintf("Warning: not punishing whitelisted peer %s!\n", pto->addr.ToString());
|
|
||||||
else {
|
|
||||||
pto->fDisconnect = true;
|
|
||||||
if (pto->addr.IsLocal())
|
|
||||||
LogPrintf("Warning: not banning local peer %s!\n", pto->addr.ToString());
|
|
||||||
else
|
|
||||||
{
|
|
||||||
connman.Ban(pto->addr, BanReasonNodeMisbehaving);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state.fShouldBan = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_FOREACH(const CBlockReject& reject, state.rejects)
|
|
||||||
connman.PushMessage(pto, NetMsgType::REJECT, (string)NetMsgType::BLOCK, reject.chRejectCode, reject.strRejectReason, reject.hashBlock);
|
|
||||||
state.rejects.clear();
|
|
||||||
|
|
||||||
// Start block sync
|
// Start block sync
|
||||||
if (pindexBestHeader == NULL)
|
if (pindexBestHeader == NULL)
|
||||||
pindexBestHeader = chainActive.Tip();
|
pindexBestHeader = chainActive.Tip();
|
||||||
|
@ -6901,6 +6903,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
|
||||||
// should only happen during initial block download.
|
// should only happen during initial block download.
|
||||||
LogPrintf("Peer=%d is stalling block download, disconnecting\n", pto->id);
|
LogPrintf("Peer=%d is stalling block download, disconnecting\n", pto->id);
|
||||||
pto->fDisconnect = true;
|
pto->fDisconnect = true;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
// In case there is a block that has been in flight from this peer for 2 + 0.5 * N times the block interval
|
// In case there is a block that has been in flight from this peer for 2 + 0.5 * N times the block interval
|
||||||
// (with N the number of peers from which we're downloading validated blocks), disconnect due to timeout.
|
// (with N the number of peers from which we're downloading validated blocks), disconnect due to timeout.
|
||||||
|
@ -6913,6 +6916,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
|
||||||
if (nNow > state.nDownloadingSince + consensusParams.nPowTargetSpacing * (BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads)) {
|
if (nNow > state.nDownloadingSince + consensusParams.nPowTargetSpacing * (BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads)) {
|
||||||
LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", queuedBlock.hash.ToString(), pto->id);
|
LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", queuedBlock.hash.ToString(), pto->id);
|
||||||
pto->fDisconnect = true;
|
pto->fDisconnect = true;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue