@@ -1513,18 +1513,12 @@ void CConnman::SocketHandler()
15131513 }
15141514 }
15151515
1516+ const NodesSnapshot snap{*this , /* shuffle=*/ false };
1517+
15161518 //
15171519 // Service each socket
15181520 //
1519- std::vector<CNode*> vNodesCopy;
1520- {
1521- LOCK (cs_vNodes);
1522- vNodesCopy = vNodes;
1523- for (CNode* pnode : vNodesCopy)
1524- pnode->AddRef ();
1525- }
1526- for (CNode* pnode : vNodesCopy)
1527- {
1521+ for (CNode* pnode : snap.Nodes ()) {
15281522 if (interruptNet)
15291523 return ;
15301524
@@ -1606,11 +1600,6 @@ void CConnman::SocketHandler()
16061600
16071601 if (InactivityCheck (*pnode)) pnode->fDisconnect = true ;
16081602 }
1609- {
1610- LOCK (cs_vNodes);
1611- for (CNode* pnode : vNodesCopy)
1612- pnode->Release ();
1613- }
16141603}
16151604
16161605void CConnman::ThreadSocketHandler ()
@@ -2224,49 +2213,34 @@ void CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFai
22242213void CConnman::ThreadMessageHandler ()
22252214{
22262215 SetSyscallSandboxPolicy (SyscallSandboxPolicy::MESSAGE_HANDLER);
2227- FastRandomContext rng;
22282216 while (!flagInterruptMsgProc)
22292217 {
2230- std::vector<CNode*> vNodesCopy;
2231- {
2232- LOCK (cs_vNodes);
2233- vNodesCopy = vNodes;
2234- for (CNode* pnode : vNodesCopy) {
2235- pnode->AddRef ();
2236- }
2237- }
2238-
22392218 bool fMoreWork = false ;
22402219
2241- // Randomize the order in which we process messages from/to our peers.
2242- // This prevents attacks in which an attacker exploits having multiple
2243- // consecutive connections in the vNodes list.
2244- Shuffle (vNodesCopy.begin (), vNodesCopy.end (), rng);
2245-
2246- for (CNode* pnode : vNodesCopy)
22472220 {
2248- if (pnode->fDisconnect )
2249- continue ;
2221+ // Randomize the order in which we process messages from/to our peers.
2222+ // This prevents attacks in which an attacker exploits having multiple
2223+ // consecutive connections in the vNodes list.
2224+ const NodesSnapshot snap{*this , /* shuffle=*/ true };
22502225
2251- // Receive messages
2252- bool fMoreNodeWork = m_msgproc->ProcessMessages (pnode, flagInterruptMsgProc);
2253- fMoreWork |= (fMoreNodeWork && !pnode->fPauseSend );
2254- if (flagInterruptMsgProc)
2255- return ;
2256- // Send messages
2257- {
2258- LOCK (pnode->cs_sendProcessing );
2259- m_msgproc->SendMessages (pnode);
2260- }
2226+ for (CNode* pnode : snap.Nodes ()) {
2227+ if (pnode->fDisconnect )
2228+ continue ;
22612229
2262- if (flagInterruptMsgProc)
2263- return ;
2264- }
2230+ // Receive messages
2231+ bool fMoreNodeWork = m_msgproc->ProcessMessages (pnode, flagInterruptMsgProc);
2232+ fMoreWork |= (fMoreNodeWork && !pnode->fPauseSend );
2233+ if (flagInterruptMsgProc)
2234+ return ;
2235+ // Send messages
2236+ {
2237+ LOCK (pnode->cs_sendProcessing );
2238+ m_msgproc->SendMessages (pnode);
2239+ }
22652240
2266- {
2267- LOCK (cs_vNodes);
2268- for (CNode* pnode : vNodesCopy)
2269- pnode->Release ();
2241+ if (flagInterruptMsgProc)
2242+ return ;
2243+ }
22702244 }
22712245
22722246 WAIT_LOCK (mutexMsgProc, lock);
0 commit comments