@@ -783,6 +783,46 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
783783 BOOST_CHECK (bucketAndEntry_asmap1_deser_addr1.second != bucketAndEntry_asmap1_deser_addr2.second );
784784}
785785
786+ BOOST_AUTO_TEST_CASE (remove_invalid)
787+ {
788+ // Confirm that invalid addresses are ignored in unserialization.
789+
790+ CAddrManTest addrman;
791+ CDataStream stream (SER_NETWORK, PROTOCOL_VERSION);
792+
793+ const CAddress new1{ResolveService (" 5.5.5.5" ), NODE_NONE};
794+ const CAddress new2{ResolveService (" 6.6.6.6" ), NODE_NONE};
795+ const CAddress tried1{ResolveService (" 7.7.7.7" ), NODE_NONE};
796+ const CAddress tried2{ResolveService (" 8.8.8.8" ), NODE_NONE};
797+
798+ addrman.Add ({new1, tried1, new2, tried2}, CNetAddr{});
799+ addrman.Good (tried1);
800+ addrman.Good (tried2);
801+ BOOST_REQUIRE_EQUAL (addrman.size (), 4 );
802+
803+ stream << addrman;
804+
805+ const std::string str{stream.str ()};
806+ size_t pos;
807+
808+ const char new2_raw[]{6 , 6 , 6 , 6 };
809+ const uint8_t new2_raw_replacement[]{0 , 0 , 0 , 0 }; // 0.0.0.0 is !IsValid()
810+ pos = str.find (new2_raw, 0 , sizeof (new2_raw));
811+ BOOST_REQUIRE (pos != std::string::npos);
812+ BOOST_REQUIRE (pos + sizeof (new2_raw_replacement) <= stream.size ());
813+ memcpy (stream.data () + pos, new2_raw_replacement, sizeof (new2_raw_replacement));
814+
815+ const char tried2_raw[]{8 , 8 , 8 , 8 };
816+ const uint8_t tried2_raw_replacement[]{255 , 255 , 255 , 255 }; // 255.255.255.255 is !IsValid()
817+ pos = str.find (tried2_raw, 0 , sizeof (tried2_raw));
818+ BOOST_REQUIRE (pos != std::string::npos);
819+ BOOST_REQUIRE (pos + sizeof (tried2_raw_replacement) <= stream.size ());
820+ memcpy (stream.data () + pos, tried2_raw_replacement, sizeof (tried2_raw_replacement));
821+
822+ addrman.Clear ();
823+ stream >> addrman;
824+ BOOST_CHECK_EQUAL (addrman.size (), 2 );
825+ }
786826
787827BOOST_AUTO_TEST_CASE (addrman_selecttriedcollision)
788828{
0 commit comments