@@ -302,9 +302,10 @@ class PeerManagerImpl final : public PeerManager
302
302
/* * Maybe disconnect a peer and discourage future connections from its address.
303
303
*
304
304
* @param[in] pnode The node to check.
305
+ * @param[in] peer The peer object to check.
305
306
* @return True if the peer was marked for disconnection in this function
306
307
*/
307
- bool MaybeDiscourageAndDisconnect (CNode& pnode);
308
+ bool MaybeDiscourageAndDisconnect (CNode& pnode, Peer& peer );
308
309
309
310
void ProcessOrphanTx (std::set<uint256>& orphan_work_set) EXCLUSIVE_LOCKS_REQUIRED(cs_main, g_cs_orphans);
310
311
/* * Process a single headers message from a peer. */
@@ -3996,43 +3997,39 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
3996
3997
return ;
3997
3998
}
3998
3999
3999
- bool PeerManagerImpl::MaybeDiscourageAndDisconnect (CNode& pnode)
4000
+ bool PeerManagerImpl::MaybeDiscourageAndDisconnect (CNode& pnode, Peer& peer )
4000
4001
{
4001
- const NodeId peer_id{pnode.GetId ()};
4002
- PeerRef peer = GetPeerRef (peer_id);
4003
- if (peer == nullptr ) return false ;
4004
-
4005
4002
{
4006
- LOCK (peer-> m_misbehavior_mutex );
4003
+ LOCK (peer. m_misbehavior_mutex );
4007
4004
4008
4005
// There's nothing to do if the m_should_discourage flag isn't set
4009
- if (!peer-> m_should_discourage ) return false ;
4006
+ if (!peer. m_should_discourage ) return false ;
4010
4007
4011
- peer-> m_should_discourage = false ;
4008
+ peer. m_should_discourage = false ;
4012
4009
} // peer.m_misbehavior_mutex
4013
4010
4014
4011
if (pnode.HasPermission (PF_NOBAN)) {
4015
4012
// We never disconnect or discourage peers for bad behavior if they have the NOBAN permission flag
4016
- LogPrintf (" Warning: not punishing noban peer %d!\n " , peer_id );
4013
+ LogPrintf (" Warning: not punishing noban peer %d!\n " , peer. m_id );
4017
4014
return false ;
4018
4015
}
4019
4016
4020
4017
if (pnode.IsManualConn ()) {
4021
4018
// We never disconnect or discourage manual peers for bad behavior
4022
- LogPrintf (" Warning: not punishing manually connected peer %d!\n " , peer_id );
4019
+ LogPrintf (" Warning: not punishing manually connected peer %d!\n " , peer. m_id );
4023
4020
return false ;
4024
4021
}
4025
4022
4026
4023
if (pnode.addr .IsLocal ()) {
4027
4024
// We disconnect local peers for bad behavior but don't discourage (since that would discourage
4028
4025
// all peers on the same local address)
4029
- LogPrintf (" Warning: disconnecting but not discouraging local peer %d!\n " , peer_id );
4026
+ LogPrintf (" Warning: disconnecting but not discouraging local peer %d!\n " , peer. m_id );
4030
4027
pnode.fDisconnect = true ;
4031
4028
return true ;
4032
4029
}
4033
4030
4034
4031
// Normal case: Disconnect the peer and discourage all nodes sharing the address
4035
- LogPrint (BCLog::NET, " Disconnecting and discouraging peer %d!\n " , peer_id );
4032
+ LogPrint (BCLog::NET, " Disconnecting and discouraging peer %d!\n " , peer. m_id );
4036
4033
if (m_banman) m_banman->Discourage (pnode.addr );
4037
4034
m_connman.DisconnectNode (pnode.addr );
4038
4035
return true ;
@@ -4319,11 +4316,12 @@ class CompareInvMempoolOrder
4319
4316
bool PeerManagerImpl::SendMessages (CNode* pto)
4320
4317
{
4321
4318
PeerRef peer = GetPeerRef (pto->GetId ());
4319
+ if (!peer) return false ;
4322
4320
const Consensus::Params& consensusParams = m_chainparams.GetConsensus ();
4323
4321
4324
4322
// We must call MaybeDiscourageAndDisconnect first, to ensure that we'll
4325
4323
// disconnect misbehaving peers even before the version handshake is complete.
4326
- if (MaybeDiscourageAndDisconnect (*pto)) return true ;
4324
+ if (MaybeDiscourageAndDisconnect (*pto, *peer )) return true ;
4327
4325
4328
4326
// Don't send anything until the version handshake is complete
4329
4327
if (!pto->fSuccessfullyConnected || pto->fDisconnect )
0 commit comments