Browse Source

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.
0.14
Cory Fields 8 years ago
parent
commit
fedea8a14d
  1. 46
      src/main.cpp

46
src/main.cpp

@ -6512,7 +6512,7 @@ bool SendMessages(CNode* pto, CConnman& connman) @@ -6512,7 +6512,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
const Consensus::Params& consensusParams = Params().GetConsensus();
{
// Don't send anything until we get its version message
if (pto->nVersion == 0)
if (pto->nVersion == 0 || pto->fDisconnect)
return true;
//
@ -6548,6 +6548,28 @@ bool SendMessages(CNode* pto, CConnman& connman) @@ -6548,6 +6548,28 @@ bool SendMessages(CNode* pto, CConnman& connman)
if (!lockMain)
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
int64_t nNow = GetTimeMicros();
if (!IsInitialBlockDownload() && pto->nNextLocalAddrSend < nNow) {
@ -6584,26 +6606,6 @@ bool SendMessages(CNode* pto, CConnman& connman) @@ -6584,26 +6606,6 @@ bool SendMessages(CNode* pto, CConnman& connman)
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
if (pindexBestHeader == NULL)
pindexBestHeader = chainActive.Tip();
@ -6901,6 +6903,7 @@ bool SendMessages(CNode* pto, CConnman& connman) @@ -6901,6 +6903,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
// should only happen during initial block download.
LogPrintf("Peer=%d is stalling block download, disconnecting\n", pto->id);
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
// (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) @@ -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)) {
LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", queuedBlock.hash.ToString(), pto->id);
pto->fDisconnect = true;
return true;
}
}

Loading…
Cancel
Save