Changeset View
Changeset View
Standalone View
Standalone View
src/test/net_tests.cpp
Show First 20 Lines • Show All 290 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(LocalAddress_BasicLifecycle) { | ||||
BOOST_CHECK_EQUAL(IsLocal(addr), false); | BOOST_CHECK_EQUAL(IsLocal(addr), false); | ||||
BOOST_CHECK_EQUAL(AddLocal(addr, 1000), true); | BOOST_CHECK_EQUAL(AddLocal(addr, 1000), true); | ||||
BOOST_CHECK_EQUAL(IsLocal(addr), true); | BOOST_CHECK_EQUAL(IsLocal(addr), true); | ||||
RemoveLocal(addr); | RemoveLocal(addr); | ||||
BOOST_CHECK_EQUAL(IsLocal(addr), false); | BOOST_CHECK_EQUAL(IsLocal(addr), false); | ||||
} | } | ||||
// prior to PR #14728, this test triggers an undefined behavior | |||||
BOOST_AUTO_TEST_CASE(ipv4_peer_with_ipv6_addrMe_test) { | |||||
// set up local addresses; all that's necessary to reproduce the bug is | |||||
// that a normal IPv4 address is among the entries, but if this address is | |||||
// !IsRoutable the undefined behavior is easier to trigger deterministically | |||||
{ | |||||
LOCK(cs_mapLocalHost); | |||||
in_addr ipv4AddrLocal; | |||||
ipv4AddrLocal.s_addr = 0x0100007f; | |||||
CNetAddr addr = CNetAddr(ipv4AddrLocal); | |||||
LocalServiceInfo lsi; | |||||
lsi.nScore = 23; | |||||
lsi.nPort = 42; | |||||
mapLocalHost[addr] = lsi; | |||||
} | |||||
// create a peer with an IPv4 address | |||||
in_addr ipv4AddrPeer; | |||||
ipv4AddrPeer.s_addr = 0xa0b0c001; | |||||
CAddress addr = CAddress(CService(ipv4AddrPeer, 7777), NODE_NETWORK); | |||||
std::unique_ptr<CNode> pnode = | |||||
std::make_unique<CNode>(0, NODE_NETWORK, 0, INVALID_SOCKET, addr, 0, 0, | |||||
CAddress{}, std::string{}, false); | |||||
pnode->fSuccessfullyConnected.store(true); | |||||
// the peer claims to be reaching us via IPv6 | |||||
in6_addr ipv6AddrLocal; | |||||
memset(ipv6AddrLocal.s6_addr, 0, 16); | |||||
ipv6AddrLocal.s6_addr[0] = 0xcc; | |||||
CAddress addrLocal = CAddress(CService(ipv6AddrLocal, 7777), NODE_NETWORK); | |||||
pnode->SetAddrLocal(addrLocal); | |||||
// before patch, this causes undefined behavior detectable with clang's | |||||
// -fsanitize=memory | |||||
AdvertiseLocal(&*pnode); | |||||
// suppress no-checks-run warning; if this test fails, it's by triggering a | |||||
// sanitizer | |||||
BOOST_CHECK(1); | |||||
} | |||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |