Skip to content

Commit a3d090d

Browse files
committed
net: Restrict period when cs_vNodes mutex is locked
1 parent f0b4572 commit a3d090d

File tree

4 files changed

+5
-20
lines changed

4 files changed

+5
-20
lines changed

src/init.cpp

+1-14
Original file line numberDiff line numberDiff line change
@@ -200,20 +200,7 @@ void Shutdown(NodeContext& node)
200200
// Because these depend on each-other, we make sure that neither can be
201201
// using the other before destroying them.
202202
if (node.peerman) UnregisterValidationInterface(node.peerman.get());
203-
// Follow the lock order requirements:
204-
// * CheckForStaleTipAndEvictPeers locks cs_main before indirectly calling GetExtraFullOutboundCount
205-
// which locks cs_vNodes.
206-
// * ProcessMessage locks cs_main and g_cs_orphans before indirectly calling ForEachNode which
207-
// locks cs_vNodes.
208-
// * CConnman::Stop calls DeleteNode, which calls FinalizeNode, which locks cs_main and calls
209-
// EraseOrphansFor, which locks g_cs_orphans.
210-
//
211-
// Thus the implicit locking order requirement is: (1) cs_main, (2) g_cs_orphans, (3) cs_vNodes.
212-
if (node.connman) {
213-
node.connman->StopThreads();
214-
LOCK2(::cs_main, ::g_cs_orphans);
215-
node.connman->StopNodes();
216-
}
203+
if (node.connman) node.connman->Stop();
217204

218205
StopTorControl();
219206

src/net.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -2636,22 +2636,22 @@ void CConnman::StopNodes()
26362636
}
26372637

26382638
// Close sockets
2639-
LOCK(cs_vNodes);
2640-
for (CNode* pnode : vNodes)
2639+
std::vector<CNode*> nodes;
2640+
WITH_LOCK(cs_vNodes, nodes.swap(vNodes));
2641+
for (CNode* pnode : nodes)
26412642
pnode->CloseSocketDisconnect();
26422643
for (ListenSocket& hListenSocket : vhListenSocket)
26432644
if (hListenSocket.socket != INVALID_SOCKET)
26442645
if (!CloseSocket(hListenSocket.socket))
26452646
LogPrintf("CloseSocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError()));
26462647

26472648
// clean up some globals (to help leak detection)
2648-
for (CNode* pnode : vNodes) {
2649+
for (CNode* pnode : nodes) {
26492650
DeleteNode(pnode);
26502651
}
26512652
for (CNode* pnode : vNodesDisconnected) {
26522653
DeleteNode(pnode);
26532654
}
2654-
vNodes.clear();
26552655
vNodesDisconnected.clear();
26562656
vhListenSocket.clear();
26572657
semOutbound.reset();

src/test/fuzz/process_message.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ void fuzz_target(FuzzBufferType buffer, const std::string& LIMIT_TO_MESSAGE_TYPE
100100
g_setup->m_node.peerman->SendMessages(&p2p_node);
101101
}
102102
SyncWithValidationInterfaceQueue();
103-
LOCK2(::cs_main, g_cs_orphans); // See init.cpp for rationale for implicit locking order requirement
104103
g_setup->m_node.connman->StopNodes();
105104
}
106105

src/test/fuzz/process_messages.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,5 @@ FUZZ_TARGET_INIT(process_messages, initialize_process_messages)
8080
}
8181
}
8282
SyncWithValidationInterfaceQueue();
83-
LOCK2(::cs_main, g_cs_orphans); // See init.cpp for rationale for implicit locking order requirement
8483
g_setup->m_node.connman->StopNodes();
8584
}

0 commit comments

Comments
 (0)