Skip to content

Commit 4694732

Browse files
committed
Merge bitcoin/bitcoin#32338: net: remove unnecessary check from AlreadyConnectedToAddress()
f1b1428 test: Same addr, diff port is already connected (David Gumberg) 94e85a8 net: remove unnecessary check from AlreadyConnectedToAddress() (Vasil Dimov) Pull request description: `CConnman::AlreadyConnectedToAddress()` searches the existent nodes by address or by address-and-port: ```cpp FindNode(static_cast<CNetAddr>(addr)) || FindNode(addr.ToStringAddrPort()) ``` but: * if there is a match by just the address, then the address-and-port search will not be evaluated and the whole condition will be `true` * if the there is no node with the same address, then the second search by address-and-port will not find a match either. The search by address-and-port is comparing against `CNode::m_addr_name` which could be a hostname, e.g. `"node.foobar.com:8333"`, but `addr.ToStringAddrPort()` is always going to be numeric. --- In other words: let `A` be "CNetAddr equals" and `B` be "addr:port string matches", then: * If `A` (is `true`), then `B` is irrelevant, so the condition `A || B` is equivalent to `A` is `true`. * Observation in this PR: if `!A` (`A` is `false`), then `!B` for sure, thus the condition `A || B` is equivalent to `A` is `false`. So, simplify `A || B` to `A`. https://en.wikipedia.org/wiki/Modus_tollens `!A => !B` is equivalent to `B => A`. So the added fuzz test asserts that if `B` is `true`, then `A` is `true`. ACKs for top commit: davidgumberg: crACK f1b1428 achow101: ACK f1b1428 theuni: utACK f1b1428 mzumsande: Code Review ACK f1b1428 Tree-SHA512: d744b60e9bace121faa3a746463f6b6e0e6ef08eac0e7879326cbd5f4721e47e6e10f6203dfd3870a2057c4ddd1860692c070ef048a76d773b84e6c2f840cc86
2 parents 7db0961 + f1b1428 commit 4694732

File tree

3 files changed

+13
-2
lines changed

3 files changed

+13
-2
lines changed

src/net.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ CNode* CConnman::FindNode(const CService& addr)
367367

368368
bool CConnman::AlreadyConnectedToAddress(const CAddress& addr)
369369
{
370-
return FindNode(static_cast<CNetAddr>(addr)) || FindNode(addr.ToStringAddrPort());
370+
return FindNode(static_cast<CNetAddr>(addr));
371371
}
372372

373373
bool CConnman::CheckIncomingNonce(uint64_t nonce)

src/test/fuzz/netaddress.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,14 @@ FUZZ_TARGET(netaddress)
101101
(void)net_addr.GetReachabilityFrom(other_net_addr);
102102
(void)sub_net.Match(other_net_addr);
103103

104-
const CService other_service{net_addr, fuzzed_data_provider.ConsumeIntegral<uint16_t>()};
104+
const CService other_service{fuzzed_data_provider.ConsumeBool() ? net_addr : other_net_addr, fuzzed_data_provider.ConsumeIntegral<uint16_t>()};
105105
assert((service == other_service) != (service != other_service));
106106
(void)(service < other_service);
107107

108+
if (service.ToStringAddrPort() == other_service.ToStringAddrPort()) {
109+
assert(static_cast<CNetAddr>(service) == static_cast<CNetAddr>(other_service));
110+
}
111+
108112
const CSubNet sub_net_copy_1{net_addr, other_net_addr};
109113
const CSubNet sub_net_copy_2{net_addr};
110114

src/test/net_peer_connection_tests.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,13 @@ BOOST_FIXTURE_TEST_CASE(test_addnode_getaddednodeinfo_and_connection_detection,
155155
BOOST_CHECK(connman->AlreadyConnectedPublic(node->addr));
156156
}
157157

158+
BOOST_TEST_MESSAGE("\nCheck that peers with the same addresses as connected peers but different ports are detected as connected.");
159+
for (auto node : connman->TestNodes()) {
160+
uint16_t changed_port = node->addr.GetPort() + 1;
161+
CService address_with_changed_port{node->addr, changed_port};
162+
BOOST_CHECK(connman->AlreadyConnectedPublic(CAddress{address_with_changed_port, NODE_NONE}));
163+
}
164+
158165
// Clean up
159166
for (auto node : connman->TestNodes()) {
160167
peerman->FinalizeNode(*node);

0 commit comments

Comments
 (0)