mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-05-30 15:54:03 +02:00
Merge bitcoin/bitcoin#30394: net: fix race condition in self-connect detection
16bd283b3aReapply "test: p2p: check that connecting to ourself leads to disconnect" (Sebastian Falbesoner)0dbcd4c148net: prevent sending messages in `NetEventsInterface::InitializeNode` (Sebastian Falbesoner)66673f1c13net: fix race condition in self-connect detection (Sebastian Falbesoner) Pull request description: This PR fixes a recently discovered race condition in the self-connect detection (see #30362 and #30368). Initiating an outbound network connection currently involves the following steps after the socket connection is established (see [`CConnman::OpenNetworkConnection`](bd5d1688b4/src/net.cpp (L2923-L2930)) method): 1. set up node state 2. queue VERSION message (both steps 1 and 2 happen in [`InitializeNode`](bd5d1688b4/src/net_processing.cpp (L1662-L1683))) 3. add new node to vector `m_nodes` If we connect to ourself, it can happen that the sent VERSION message (step 2) is received and processed locally *before* the node object is added to the connection manager's `m_nodes` vector (step 3). In this case, the self-connect remains undiscovered, as the detection doesn't find the outbound peer in `m_nodes` yet (see `CConnman::CheckIncomingNonce`). Fix this by swapping the order of 2. and 3., by taking the `PushNodeVersion` call out of `InitializeNode` and doing that in the `SendMessages` method instead, which is only called for `CNode` instances in `m_nodes`. The temporarily reverted test introduced in #30362 is readded. Fixes #30368. Thanks go to vasild, mzumsande and dergoegge for suggestions on how to fix this (see https://github.com/bitcoin/bitcoin/issues/30368#issuecomment-2200625017 ff. and https://github.com/bitcoin/bitcoin/pull/30394#discussion_r1668290789). ACKs for top commit: naiyoma: tested ACK [16bd283b3a), built and tested locally, test passes successfully. mzumsande: ACK16bd283b3atdb3: ACK16bd283b3aglozow: ACK16bd283b3adergoegge: ACK16bd283b3aTree-SHA512: 5b8aced6cda8deb38d4cd3fe4980b8af505d37ffa0925afaa734c5d81efe9d490dc48a42e1d0d45dd2961c0e1172a3d5b6582ae9a2d642f2592a17fbdc184445
This commit is contained in:
@@ -17,6 +17,7 @@ from test_framework.messages import (
|
||||
NODE_WITNESS,
|
||||
)
|
||||
from test_framework.p2p import P2PInterface
|
||||
from test_framework.util import p2p_port
|
||||
|
||||
|
||||
# Desirable service flags for outbound non-pruned and pruned peers. Note that
|
||||
@@ -88,9 +89,11 @@ class P2PHandshakeTest(BitcoinTestFramework):
|
||||
with node.assert_debug_log([f"feeler connection completed"]):
|
||||
self.add_outbound_connection(node, "feeler", NODE_NONE, wait_for_disconnect=True)
|
||||
|
||||
# TODO: re-add test introduced in commit 5d2fb14bafe4e80c0a482d99e5ebde07c477f000
|
||||
# ("test: p2p: check that connecting to ourself leads to disconnect") once
|
||||
# the race condition causing issue #30368 is fixed
|
||||
self.log.info("Check that connecting to ourself leads to immediate disconnect")
|
||||
with node.assert_debug_log(["connected to self", "disconnecting"]):
|
||||
node_listen_addr = f"127.0.0.1:{p2p_port(0)}"
|
||||
node.addconnection(node_listen_addr, "outbound-full-relay", self.options.v2transport)
|
||||
self.wait_until(lambda: len(node.getpeerinfo()) == 0)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
Reference in New Issue
Block a user