diff options
Diffstat (limited to 'src/net_processing.cpp')
| -rw-r--r-- | src/net_processing.cpp | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/src/net_processing.cpp b/src/net_processing.cpp index f8b22cd7c..570cca0c6 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3559,7 +3559,7 @@ void ProcessMessage( bool PeerLogicValidation::MaybeDiscourageAndDisconnect(CNode& pnode) { - AssertLockHeld(cs_main); + LOCK(cs_main); CNodeState &state = *State(pnode.GetId()); if (state.m_should_discourage) { @@ -3675,9 +3675,6 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& inter LogPrint(BCLog::NET, "%s(%s, %u bytes): Unknown exception caught\n", __func__, SanitizeString(msg_type), nMessageSize); } - LOCK(cs_main); - MaybeDiscourageAndDisconnect(*pfrom); - return fMoreWork; } @@ -3839,6 +3836,10 @@ bool PeerLogicValidation::SendMessages(CNode* pto) { const Consensus::Params& consensusParams = Params().GetConsensus(); + // We must call MaybeDiscourageAndDisconnect first, to ensure that we'll + // disconnect misbehaving peers even before the version handshake is complete. + if (MaybeDiscourageAndDisconnect(*pto)) return true; + // Don't send anything until the version handshake is complete if (!pto->fSuccessfullyConnected || pto->fDisconnect) return true; @@ -3878,8 +3879,6 @@ bool PeerLogicValidation::SendMessages(CNode* pto) { LOCK(cs_main); - if (MaybeDiscourageAndDisconnect(*pto)) return true; - CNodeState &state = *State(pto->GetId()); // Address refresh broadcast |