@@ -41,32 +41,6 @@ class AddrManUncorrupted : public AddrManSerializationMock
4141 }
4242};
4343
44- class AddrManCorrupted : public AddrManSerializationMock
45- {
46- public:
47- void Serialize (CDataStream& s) const override
48- {
49- // Produces corrupt output that claims addrman has 20 addrs when it only has one addr.
50- unsigned char nVersion = 1 ;
51- s << nVersion;
52- s << ((unsigned char )32 );
53- s << uint256::ONE;
54- s << 10 ; // nNew
55- s << 10 ; // nTried
56-
57- int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30 );
58- s << nUBuckets;
59-
60- CService serv;
61- BOOST_CHECK (Lookup (" 252.1.1.1" , serv, 7777 , false ));
62- CAddress addr = CAddress (serv, NODE_NONE);
63- CNetAddr resolved;
64- BOOST_CHECK (LookupHost (" 252.2.2.2" , resolved, false ));
65- AddrInfo info = AddrInfo (addr, resolved);
66- s << info;
67- }
68- };
69-
7044static CDataStream AddrmanToStream (const AddrManSerializationMock& _addrman)
7145{
7246 CDataStream ssPeersIn (SER_DISK, CLIENT_VERSION);
@@ -1043,13 +1017,39 @@ BOOST_AUTO_TEST_CASE(load_addrman)
10431017 BOOST_CHECK (addrman2.size () == 3 );
10441018}
10451019
1020+ // Produce a corrupt peers.dat that claims 20 addrs when it only has one addr.
1021+ static CDataStream MakeCorruptPeersDat ()
1022+ {
1023+ CDataStream s (SER_DISK, CLIENT_VERSION);
1024+ s << ::Params ().MessageStart ();
1025+
1026+ unsigned char nVersion = 1 ;
1027+ s << nVersion;
1028+ s << ((unsigned char )32 );
1029+ s << uint256::ONE;
1030+ s << 10 ; // nNew
1031+ s << 10 ; // nTried
1032+
1033+ int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30 );
1034+ s << nUBuckets;
1035+
1036+ CService serv;
1037+ BOOST_CHECK (Lookup (" 252.1.1.1" , serv, 7777 , false ));
1038+ CAddress addr = CAddress (serv, NODE_NONE);
1039+ CNetAddr resolved;
1040+ BOOST_CHECK (LookupHost (" 252.2.2.2" , resolved, false ));
1041+ AddrInfo info = AddrInfo (addr, resolved);
1042+ s << info;
1043+
1044+ std::string str = s.str ();
1045+ std::vector<unsigned char > vchData (str.begin (), str.end ());
1046+ return CDataStream (vchData, SER_DISK, CLIENT_VERSION);
1047+ }
10461048
10471049BOOST_AUTO_TEST_CASE (load_addrman_corrupted)
10481050{
1049- AddrManCorrupted addrmanCorrupted;
1050-
1051- // Test that the de-serialization of corrupted addrman throws an exception.
1052- CDataStream ssPeers1 = AddrmanToStream (addrmanCorrupted);
1051+ // Test that the de-serialization of corrupted peers.dat throws an exception.
1052+ CDataStream ssPeers1 = MakeCorruptPeersDat ();
10531053 bool exceptionThrown = false ;
10541054 AddrMan addrman1 (/* asmap */ std::vector<bool >(), /* deterministic */ false , /* consistency_check_ratio */ 100 );
10551055 BOOST_CHECK (addrman1.size () == 0 );
@@ -1065,7 +1065,7 @@ BOOST_AUTO_TEST_CASE(load_addrman_corrupted)
10651065 BOOST_CHECK (exceptionThrown);
10661066
10671067 // Test that ReadFromStream fails if peers.dat is corrupt
1068- CDataStream ssPeers2 = AddrmanToStream (addrmanCorrupted );
1068+ CDataStream ssPeers2 = MakeCorruptPeersDat ( );
10691069
10701070 AddrMan addrman2 (/* asmap */ std::vector<bool >(), /* deterministic */ false , /* consistency_check_ratio */ 100 );
10711071 BOOST_CHECK (addrman2.size () == 0 );
0 commit comments