Skip to content

Commit fedea8a

Browse files
committed
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.
1 parent d74e352 commit fedea8a

File tree

1 file changed

+25
-21
lines changed

1 file changed

+25
-21
lines changed

src/main.cpp

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6512,7 +6512,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
65126512
const Consensus::Params& consensusParams = Params().GetConsensus();
65136513
{
65146514
// Don't send anything until we get its version message
6515-
if (pto->nVersion == 0)
6515+
if (pto->nVersion == 0 || pto->fDisconnect)
65166516
return true;
65176517

65186518
//
@@ -6548,6 +6548,28 @@ bool SendMessages(CNode* pto, CConnman& connman)
65486548
if (!lockMain)
65496549
return true;
65506550

6551+
CNodeState &state = *State(pto->GetId());
6552+
6553+
BOOST_FOREACH(const CBlockReject& reject, state.rejects)
6554+
connman.PushMessage(pto, NetMsgType::REJECT, (string)NetMsgType::BLOCK, reject.chRejectCode, reject.strRejectReason, reject.hashBlock);
6555+
state.rejects.clear();
6556+
6557+
if (state.fShouldBan) {
6558+
state.fShouldBan = false;
6559+
if (pto->fWhitelisted)
6560+
LogPrintf("Warning: not punishing whitelisted peer %s!\n", pto->addr.ToString());
6561+
else {
6562+
pto->fDisconnect = true;
6563+
if (pto->addr.IsLocal())
6564+
LogPrintf("Warning: not banning local peer %s!\n", pto->addr.ToString());
6565+
else
6566+
{
6567+
connman.Ban(pto->addr, BanReasonNodeMisbehaving);
6568+
}
6569+
return true;
6570+
}
6571+
}
6572+
65516573
// Address refresh broadcast
65526574
int64_t nNow = GetTimeMicros();
65536575
if (!IsInitialBlockDownload() && pto->nNextLocalAddrSend < nNow) {
@@ -6584,26 +6606,6 @@ bool SendMessages(CNode* pto, CConnman& connman)
65846606
pto->vAddrToSend.shrink_to_fit();
65856607
}
65866608

6587-
CNodeState &state = *State(pto->GetId());
6588-
if (state.fShouldBan) {
6589-
if (pto->fWhitelisted)
6590-
LogPrintf("Warning: not punishing whitelisted peer %s!\n", pto->addr.ToString());
6591-
else {
6592-
pto->fDisconnect = true;
6593-
if (pto->addr.IsLocal())
6594-
LogPrintf("Warning: not banning local peer %s!\n", pto->addr.ToString());
6595-
else
6596-
{
6597-
connman.Ban(pto->addr, BanReasonNodeMisbehaving);
6598-
}
6599-
}
6600-
state.fShouldBan = false;
6601-
}
6602-
6603-
BOOST_FOREACH(const CBlockReject& reject, state.rejects)
6604-
connman.PushMessage(pto, NetMsgType::REJECT, (string)NetMsgType::BLOCK, reject.chRejectCode, reject.strRejectReason, reject.hashBlock);
6605-
state.rejects.clear();
6606-
66076609
// Start block sync
66086610
if (pindexBestHeader == NULL)
66096611
pindexBestHeader = chainActive.Tip();
@@ -6901,6 +6903,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
69016903
// should only happen during initial block download.
69026904
LogPrintf("Peer=%d is stalling block download, disconnecting\n", pto->id);
69036905
pto->fDisconnect = true;
6906+
return true;
69046907
}
69056908
// In case there is a block that has been in flight from this peer for 2 + 0.5 * N times the block interval
69066909
// (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)
69136916
if (nNow > state.nDownloadingSince + consensusParams.nPowTargetSpacing * (BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads)) {
69146917
LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", queuedBlock.hash.ToString(), pto->id);
69156918
pto->fDisconnect = true;
6919+
return true;
69166920
}
69176921
}
69186922

0 commit comments

Comments
 (0)