Page MenuHomePhabricator

net: fix race condition in self-connect detection
AcceptedPublic

Authored by PiRK on Aug 6 2025, 11:29.

Details

Reviewers
Fabien
Group Reviewers
Restricted Project
Summary

The logic leading to immediate disconnect when connecting to ourself has
been first introduced by Satoshi in October 2009.

Initiating an outbound network connection currently involves the
following steps after the socket connection is established (see
CConnman::OpenNetworkConnection method):

  1. set up node state
  2. queue VERSION message
  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.

Thanks go to vasild, mzumsande, dergoegge and sipa for suggestions on
how to fix this.

This is a backport of core#30394 and core#30362
Depends on D18452

Test Plan

ninja all check-all

Event Timeline

PiRK requested review of this revision.Aug 6 2025, 11:29

Tail of the build log:

PASSED          [100%]##teamcity[testFinished timestamp='2025-08-06T11:50:17.856' duration='50' flowId='tests.test_iguana.test_redeem_script_input_sigchecks' name='tests.test_iguana.test_redeem_script_input_sigchecks']


============================== 20 passed in 0.74s ==============================
[200/524] Building CXX object src/test/CMakeFiles/test_bitcoin.dir/__/wallet/test/walletdb_tests.cpp.o
[201/524] Building CXX object src/test/CMakeFiles/test_bitcoin.dir/util_tests.cpp.o
[202/524] Test Bitcoin utilities...
[203/524] Building CXX object src/pow/test/CMakeFiles/test-pow.dir/daa_tests.cpp.o
[204/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/bitcoinaddressvalidatortests.cpp.o
[205/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/test_bitcoin-qt_autogen/mocs_compilation.cpp.o
[206/524] Building CXX object src/pow/test/CMakeFiles/test-pow.dir/aserti32d_tests.cpp.o
[207/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/compattests.cpp.o
[208/524] Building CXX object src/pow/test/CMakeFiles/test-pow.dir/eda_tests.cpp.o
[209/524] Building CXX object src/seeder/test/CMakeFiles/test-seeder.dir/message_writer_tests.cpp.o
[210/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/util.cpp.o
[211/524] Building CXX object src/test/CMakeFiles/test_bitcoin.dir/__/wallet/test/wallet_tests.cpp.o
[212/524] Building CXX object src/seeder/test/CMakeFiles/test-seeder.dir/p2p_messaging_tests.cpp.o
[213/524] Linking CXX executable src/seeder/test/test-seeder
[214/524] seeder: testing db_tests
[215/524] seeder: testing options_tests
[216/524] Running utility command for check-seeder-db_tests
[217/524] seeder: testing message_writer_tests
[218/524] Running utility command for check-seeder-message_writer_tests
[219/524] Running utility command for check-seeder-options_tests
[220/524] seeder: testing p2p_messaging_tests
[221/524] Running utility command for check-seeder-p2p_messaging_tests
[222/524] seeder: testing parse_name_tests
[223/524] seeder: testing write_name_tests
[224/524] Running utility command for check-seeder-parse_name_tests
[225/524] Running utility command for check-seeder-write_name_tests
[226/524] Running seeder test suite
PASSED: seeder test suite
[227/524] Building CXX object src/pow/test/CMakeFiles/test-pow.dir/grasberg_tests.cpp.o
[228/524] Linking CXX executable src/pow/test/test-pow
[229/524] pow: testing daa_tests
[230/524] Running utility command for check-pow-daa_tests
[231/524] pow: testing eda_tests
[232/524] Running utility command for check-pow-eda_tests
[233/524] pow: testing grasberg_tests
[234/524] Running utility command for check-pow-grasberg_tests
[235/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/uritests.cpp.o
[236/524] pow: testing aserti32d_tests
[237/524] Running utility command for check-pow-aserti32d_tests
[238/524] Running pow test suite
PASSED: pow test suite
[239/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/guiutiltests.cpp.o
[240/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/apptests.cpp.o
[241/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/optiontests.cpp.o
[242/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/rpcnestedtests.cpp.o
[243/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/test_main.cpp.o
[244/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/paymentservertests.cpp.o
[245/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/__/__/wallet/test/wallet_test_fixture.cpp.o
[246/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/addressbooktests.cpp.o
[247/524] Building CXX object src/qt/test/CMakeFiles/test_bitcoin-qt.dir/wallettests.cpp.o
[248/524] Linking CXX executable src/qt/test/test_bitcoin-qt
[249/524] bitcoin-qt: testing test_bitcoin-qt
[250/524] Running bitcoin-qt test suite
PASSED: bitcoin-qt test suite
ninja: build stopped: cannot make progress due to previous errors.
Build build-clang-tidy failed with exit code 1
This revision is now accepted and ready to land.Aug 11 2025, 08:24