Skip to content

Commit 502343a

Browse files
theuniFuzzbawls
authored andcommitted
net: Split resolving out of CNetAddr
1 parent 47bf23a commit 502343a

File tree

11 files changed

+157
-131
lines changed

11 files changed

+157
-131
lines changed

src/activemasternode.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,14 +238,10 @@ bool CActiveMasternode::CreateBroadcast(std::string strService, std::string strK
238238
return false;
239239
}
240240

241-
CService service = CService(strService);
242-
243241
// The service needs the correct default port to work properly
244242
if(!CMasternodeBroadcast::CheckDefaultPort(strService, errorMessage, "CActiveMasternode::CreateBroadcast()"))
245243
return false;
246244

247-
addrman.Add(CAddress(service, NODE_NETWORK), CNetAddr("127.0.0.1"), 2 * 60 * 60);
248-
249245
return CreateBroadcast(vin, CService(strService), keyCollateralAddress, pubKeyCollateralAddress, keyMasternode, pubKeyMasternode, errorMessage, mnb);
250246
}
251247

src/masternodeman.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,8 @@ void CMasternodeMan::CountNetworks(int protocolVersion, int& ipv4, int& ipv6, in
403403
std::string strHost;
404404
int port;
405405
SplitHostPort(mn.addr.ToString(), port, strHost);
406-
CNetAddr node = CNetAddr(strHost);
406+
CNetAddr node;
407+
LookupHost(strHost.c_str(), node, false);
407408
int nNetwork = node.GetNetwork();
408409
switch (nNetwork) {
409410
case 1 :

src/net.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,8 +1204,11 @@ void ThreadMapPort()
12041204
LogPrintf("UPnP: GetExternalIPAddress() returned %d\n", r);
12051205
else {
12061206
if (externalIPAddress[0]) {
1207-
LogPrintf("UPnP: ExternalIPAddress = %s\n", externalIPAddress);
1208-
AddLocal(CNetAddr(externalIPAddress), LOCAL_UPNP);
1207+
CNetAddr resolved;
1208+
if (LookupHost(externalIPAddress, resolved, false)) {
1209+
LogPrintf("UPnP: ExternalIPAddress = %s\n", resolved.ToString().c_str());
1210+
AddLocal(resolved, LOCAL_UPNP);
1211+
}
12091212
} else
12101213
LogPrintf("UPnP: GetExternalIPAddress failed.\n");
12111214
}
@@ -1406,7 +1409,9 @@ void ThreadOpenConnections()
14061409
static bool done = false;
14071410
if (!done) {
14081411
LogPrintf("Adding fixed seed nodes as DNS doesn't seem to be available.\n");
1409-
addrman.Add(convertSeed6(Params().FixedSeeds()), CNetAddr("127.0.0.1"));
1412+
CNetAddr local;
1413+
LookupHost("127.0.0.1", local, false);
1414+
addrman.Add(convertSeed6(Params().FixedSeeds()), local);
14101415
done = true;
14111416
}
14121417
}
@@ -2410,7 +2415,10 @@ void DumpBanlist()
24102415
// valid, reachable and routable address (except for RegTest)
24112416
bool validateMasternodeIP(const std::string& addrStr)
24122417
{
2413-
CNetAddr netAddr(addrStr.c_str());
2414-
return ((IsReachable(netAddr) && netAddr.IsRoutable()) ||
2415-
(Params().IsRegTestNet() && netAddr.IsValid()));
2418+
CNetAddr resolved;
2419+
if (LookupHost(addrStr.c_str(), resolved, false)) {
2420+
return ((IsReachable(resolved) && resolved.IsRoutable()) ||
2421+
(Params().IsRegTestNet() && resolved.IsValid()));
2422+
}
2423+
return false;
24162424
}

src/netbase.cpp

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Copyright (c) 2009-2010 Satoshi Nakamoto
2-
// Copyright (c) 2009-2014 The Bitcoin developers
2+
// Copyright (c) 2009-2015 The Bitcoin developers
33
// Copyright (c) 2017-2020 The PIVX developers
44
// Distributed under the MIT/X11 software license, see the accompanying
55
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -200,6 +200,16 @@ bool LookupHost(const char* pszName, std::vector<CNetAddr>& vIP, unsigned int nM
200200
return LookupIntern(strHost.c_str(), vIP, nMaxSolutions, fAllowLookup);
201201
}
202202

203+
bool LookupHost(const char* pszName, CNetAddr& addr, bool fAllowLookup)
204+
{
205+
std::vector<CNetAddr> vIP;
206+
LookupHost(pszName, vIP, 1, fAllowLookup);
207+
if(vIP.empty())
208+
return false;
209+
addr = vIP.front();
210+
return true;
211+
}
212+
203213
bool Lookup(const char* pszName, std::vector<CService>& vAddr, int portDefault, bool fAllowLookup, unsigned int nMaxSolutions)
204214
{
205215
if (pszName[0] == 0)
@@ -712,22 +722,6 @@ CNetAddr::CNetAddr(const struct in6_addr& ipv6Addr)
712722
SetRaw(NET_IPV6, (const uint8_t*)&ipv6Addr);
713723
}
714724

715-
CNetAddr::CNetAddr(const char* pszIp)
716-
{
717-
Init();
718-
std::vector<CNetAddr> vIP;
719-
if (LookupHost(pszIp, vIP, 1, false))
720-
*this = vIP[0];
721-
}
722-
723-
CNetAddr::CNetAddr(const std::string& strIp)
724-
{
725-
Init();
726-
std::vector<CNetAddr> vIP;
727-
if (LookupHost(strIp.c_str(), vIP, 1, false))
728-
*this = vIP[0];
729-
}
730-
731725
unsigned int CNetAddr::GetByte(int n) const
732726
{
733727
return ip[15 - n];

src/netbase.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2009-2013 The Bitcoin developers
1+
// Copyright (c) 2009-2015 The Bitcoin developers
22
// Copyright (c) 2017-2019 The PIVX developers
33
// Distributed under the MIT/X11 software license, see the accompanying
44
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -48,8 +48,6 @@ class CNetAddr
4848
public:
4949
CNetAddr();
5050
CNetAddr(const struct in_addr& ipv4Addr);
51-
explicit CNetAddr(const char* pszIp);
52-
explicit CNetAddr(const std::string& strIp);
5351
void Init();
5452
void SetIP(const CNetAddr& ip);
5553

@@ -208,6 +206,7 @@ bool IsProxy(const CNetAddr& addr);
208206
bool SetNameProxy(const proxyType &addrProxy);
209207
bool HaveNameProxy();
210208
bool LookupHost(const char* pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions, bool fAllowLookup);
209+
bool LookupHost(const char* pszName, CNetAddr& addr, bool fAllowLookup);
211210
bool Lookup(const char* pszName, CService& addr, int portDefault, bool fAllowLookup);
212211
bool Lookup(const char* pszName, std::vector<CService>& vAddr, int portDefault, bool fAllowLookup, unsigned int nMaxSolutions);
213212
bool LookupNumeric(const char* pszName, CService& addr, int portDefault = 0);

src/qt/rpcconsole.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1014,7 +1014,10 @@ void RPCConsole::banSelectedNode(int bantime)
10141014
int port = 0;
10151015
SplitHostPort(nStr, port, addr);
10161016

1017-
CNode::Ban(CNetAddr(addr), BanReasonManuallyAdded, bantime);
1017+
CNetAddr resolved;
1018+
if(!LookupHost(addr.c_str(), resolved, false))
1019+
return;
1020+
CNode::Ban(resolved, BanReasonManuallyAdded, bantime);
10181021

10191022
clearSelectedNode();
10201023
clientModel->getBanTableModel()->refresh();

src/rpc/masternode.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ UniValue listmasternodes(const UniValue& params, bool fHelp)
8080
std::string strHost;
8181
int port;
8282
SplitHostPort(mn->addr.ToString(), port, strHost);
83-
CNetAddr node = CNetAddr(strHost);
83+
CNetAddr node;
84+
LookupHost(strHost.c_str(), node, false);
8485
std::string strNetwork = GetNetworkName(node.GetNetwork());
8586

8687
obj.push_back(Pair("rank", (strStatus == "ENABLED" ? s.first : 0)));

src/rpc/net.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,8 +438,11 @@ UniValue setban(const UniValue& params, bool fHelp)
438438
if (params[0].get_str().find("/") != std::string::npos)
439439
isSubnet = true;
440440

441-
if (!isSubnet)
442-
netAddr = CNetAddr(params[0].get_str());
441+
if (!isSubnet) {
442+
CNetAddr resolved;
443+
LookupHost(params[0].get_str().c_str(), resolved, false);
444+
netAddr = resolved;
445+
}
443446
else
444447
subNet = CSubNet(params[0].get_str());
445448

src/test/addrman_tests.cpp

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ class CAddrManTest : public CAddrMan
5050
}
5151
};
5252

53+
static CNetAddr ResolveIP(const char* ip)
54+
{
55+
CNetAddr addr;
56+
BOOST_CHECK_MESSAGE(LookupHost(ip, addr, false), strprintf("failed to resolve: %s", ip));
57+
return addr;
58+
}
59+
60+
static CNetAddr ResolveIP(std::string ip)
61+
{
62+
return ResolveIP(ip.c_str());
63+
}
64+
5365
BOOST_FIXTURE_TEST_SUITE(addrman_tests, BasicTestingSetup)
5466

5567
BOOST_AUTO_TEST_CASE(addrman_simple)
@@ -59,7 +71,7 @@ BOOST_AUTO_TEST_CASE(addrman_simple)
5971
// Set addrman addr placement to be deterministic.
6072
addrman.MakeDeterministic();
6173

62-
CNetAddr source = CNetAddr("252.2.2.2");
74+
CNetAddr source = ResolveIP("252.2.2.2");
6375

6476
// Test 1: Does Addrman respond correctly when empty.
6577
BOOST_CHECK(addrman.size() == 0);
@@ -100,7 +112,7 @@ BOOST_AUTO_TEST_CASE(addrman_ports)
100112
// Set addrman addr placement to be deterministic.
101113
addrman.MakeDeterministic();
102114

103-
CNetAddr source = CNetAddr("252.2.2.2");
115+
CNetAddr source = ResolveIP("252.2.2.2");
104116

105117
BOOST_CHECK(addrman.size() == 0);
106118

@@ -132,7 +144,7 @@ BOOST_AUTO_TEST_CASE(addrman_select)
132144
// Set addrman addr placement to be deterministic.
133145
addrman.MakeDeterministic();
134146

135-
CNetAddr source = CNetAddr("252.2.2.2");
147+
CNetAddr source = ResolveIP("252.2.2.2");
136148

137149
// Test 9: Select from new with 1 addr in new.
138150
CService addr1 = CService("250.1.1.1", 8333);
@@ -160,20 +172,20 @@ BOOST_AUTO_TEST_CASE(addrman_select)
160172
CService addr3 = CService("250.3.2.2", 9999);
161173
CService addr4 = CService("250.3.3.3", 9999);
162174

163-
addrman.Add(CAddress(addr2, NODE_NONE), CService("250.3.1.1", 8333));
164-
addrman.Add(CAddress(addr3, NODE_NONE), CService("250.3.1.1", 8333));
165-
addrman.Add(CAddress(addr4, NODE_NONE), CService("250.4.1.1", 8333));
175+
addrman.Add(CAddress(addr2, NODE_NONE), CService("250.3.1.1", 8333), NODE_NONE);
176+
addrman.Add(CAddress(addr3, NODE_NONE), CService("250.3.1.1", 8333), NODE_NONE);
177+
addrman.Add(CAddress(addr4, NODE_NONE), CService("250.4.1.1", 8333), NODE_NONE);
166178

167179
// Add three addresses to tried table.
168180
CService addr5 = CService("250.4.4.4", 8333);
169181
CService addr6 = CService("250.4.5.5", 7777);
170182
CService addr7 = CService("250.4.6.6", 8333);
171183

172-
addrman.Add(CAddress(addr5, NODE_NONE), CService("250.3.1.1", 8333));
184+
addrman.Add(CAddress(addr5, NODE_NONE), CService("250.3.1.1", 8333), NODE_NONE);
173185
addrman.Good(CAddress(addr5, NODE_NONE));
174-
addrman.Add(CAddress(addr6, NODE_NONE), CService("250.3.1.1", 8333));
186+
addrman.Add(CAddress(addr6, NODE_NONE), CService("250.3.1.1", 8333), NODE_NONE);
175187
addrman.Good(CAddress(addr6, NODE_NONE));
176-
addrman.Add(CAddress(addr7, NODE_NONE), CService("250.1.1.3", 8333));
188+
addrman.Add(CAddress(addr7, NODE_NONE), CService("250.1.1.3", 8333), NODE_NONE);
177189
addrman.Good(CAddress(addr7, NODE_NONE));
178190

179191
// Test 11: 6 addrs + 1 addr from last test = 7.
@@ -194,7 +206,7 @@ BOOST_AUTO_TEST_CASE(addrman_new_collisions)
194206
// Set addrman addr placement to be deterministic.
195207
addrman.MakeDeterministic();
196208

197-
CNetAddr source = CNetAddr("252.2.2.2");
209+
CNetAddr source = ResolveIP("252.2.2.2");
198210

199211
BOOST_CHECK(addrman.size() == 0);
200212

@@ -223,7 +235,7 @@ BOOST_AUTO_TEST_CASE(addrman_tried_collisions)
223235
// Set addrman addr placement to be deterministic.
224236
addrman.MakeDeterministic();
225237

226-
CNetAddr source = CNetAddr("252.2.2.2");
238+
CNetAddr source = ResolveIP("252.2.2.2");
227239

228240
BOOST_CHECK(addrman.size() == 0);
229241

@@ -260,8 +272,8 @@ BOOST_AUTO_TEST_CASE(addrman_find)
260272
CAddress addr2 = CAddress(CService("250.1.2.1", 9999), NODE_NONE);
261273
CAddress addr3 = CAddress(CService("251.255.2.1", 8333), NODE_NONE);
262274

263-
CNetAddr source1 = CNetAddr("250.1.2.1");
264-
CNetAddr source2 = CNetAddr("250.1.2.2");
275+
CNetAddr source1 = ResolveIP("250.1.2.1");
276+
CNetAddr source2 = ResolveIP("250.1.2.2");
265277

266278
addrman.Add(addr1, source1);
267279
addrman.Add(addr2, source2);
@@ -296,7 +308,7 @@ BOOST_AUTO_TEST_CASE(addrman_create)
296308
BOOST_CHECK(addrman.size() == 0);
297309

298310
CAddress addr1 = CAddress(CService("250.1.2.1", 8333), NODE_NONE);
299-
CNetAddr source1 = CNetAddr("250.1.2.1");
311+
CNetAddr source1 = ResolveIP("250.1.2.1");
300312

301313
int nId;
302314
CAddrInfo* pinfo = addrman.Create(addr1, source1, &nId);
@@ -319,7 +331,7 @@ BOOST_AUTO_TEST_CASE(addrman_delete)
319331
BOOST_CHECK(addrman.size() == 0);
320332

321333
CAddress addr1 = CAddress(CService("250.1.2.1", 8333), NODE_NONE);
322-
CNetAddr source1 = CNetAddr("250.1.2.1");
334+
CNetAddr source1 = ResolveIP("250.1.2.1");
323335

324336
int nId;
325337
addrman.Create(addr1, source1, &nId);
@@ -355,8 +367,8 @@ BOOST_AUTO_TEST_CASE(addrman_getaddr)
355367
addr4.nTime = GetAdjustedTime();
356368
CAddress addr5 = CAddress(CService("252.254.4.5", 8333), NODE_NONE);
357369
addr5.nTime = GetAdjustedTime();
358-
CNetAddr source1 = CNetAddr("250.1.2.1");
359-
CNetAddr source2 = CNetAddr("250.2.3.3");
370+
CNetAddr source1 = ResolveIP("250.1.2.1");
371+
CNetAddr source2 = ResolveIP("250.2.3.3");
360372

361373
// Test 23: Ensure GetAddr works with new addresses.
362374
addrman.Add(addr1, source1);
@@ -383,7 +395,7 @@ BOOST_AUTO_TEST_CASE(addrman_getaddr)
383395

384396
// Ensure that for all addrs in addrman, isTerrible == false.
385397
addr.nTime = GetAdjustedTime();
386-
addrman.Add(addr, CNetAddr(strAddr));
398+
addrman.Add(addr, ResolveIP(strAddr));
387399
if (i % 8 == 0)
388400
addrman.Good(addr);
389401
}
@@ -407,7 +419,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
407419
CAddress addr1 = CAddress(CService("250.1.1.1", 8333), NODE_NONE);
408420
CAddress addr2 = CAddress(CService("250.1.1.1", 9999), NODE_NONE);
409421

410-
CNetAddr source1 = CNetAddr("250.1.1.1");
422+
CNetAddr source1 = ResolveIP("250.1.1.1");
411423

412424

413425
CAddrInfo info1 = CAddrInfo(addr1, source1);
@@ -433,7 +445,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
433445
for (int i = 0; i < 255; i++) {
434446
CAddrInfo infoi = CAddrInfo(
435447
CAddress(CService("250.1.1." + boost::to_string(i)), NODE_NONE),
436-
CNetAddr("250.1.1." + boost::to_string(i)));
448+
ResolveIP("250.1.1." + boost::to_string(i)));
437449
int bucket = infoi.GetTriedBucket(nKey1);
438450
buckets.insert(bucket);
439451
}
@@ -445,7 +457,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
445457
for (int j = 0; j < 255; j++) {
446458
CAddrInfo infoj = CAddrInfo(
447459
CAddress(CService("250." + boost::to_string(j) + ".1.1"), NODE_NONE),
448-
CNetAddr("250." + boost::to_string(j) + ".1.1"));
460+
ResolveIP("250." + boost::to_string(j) + ".1.1"));
449461
int bucket = infoj.GetTriedBucket(nKey1);
450462
buckets.insert(bucket);
451463
}
@@ -464,7 +476,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
464476
CAddress addr1 = CAddress(CService("250.1.2.1", 8333), NODE_NONE);
465477
CAddress addr2 = CAddress(CService("250.1.2.1", 9999), NODE_NONE);
466478

467-
CNetAddr source1 = CNetAddr("250.1.2.1");
479+
CNetAddr source1 = ResolveIP("250.1.2.1");
468480

469481
CAddrInfo info1 = CAddrInfo(addr1, source1);
470482

@@ -486,7 +498,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
486498
for (int i = 0; i < 255; i++) {
487499
CAddrInfo infoi = CAddrInfo(
488500
CAddress(CService("250.1.1." + boost::to_string(i)), NODE_NONE),
489-
CNetAddr("250.1.1." + boost::to_string(i)));
501+
ResolveIP("250.1.1." + boost::to_string(i)));
490502
int bucket = infoi.GetNewBucket(nKey1);
491503
buckets.insert(bucket);
492504
}
@@ -499,7 +511,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
499511
CAddrInfo infoj = CAddrInfo(CAddress(
500512
CService(
501513
boost::to_string(250 + (j / 255)) + "." + boost::to_string(j % 256) + ".1.1"), NODE_NONE),
502-
CNetAddr("251.4.1.1"));
514+
ResolveIP("251.4.1.1"));
503515
int bucket = infoj.GetNewBucket(nKey1);
504516
buckets.insert(bucket);
505517
}
@@ -511,7 +523,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
511523
for (int p = 0; p < 255; p++) {
512524
CAddrInfo infoj = CAddrInfo(
513525
CAddress(CService("250.1.1.1"), NODE_NONE),
514-
CNetAddr("250." + boost::to_string(p) + ".1.1"));
526+
ResolveIP("250." + boost::to_string(p) + ".1.1"));
515527
int bucket = infoj.GetNewBucket(nKey1);
516528
buckets.insert(bucket);
517529
}

src/test/net_tests.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ class CAddrManCorrupted : public CAddrManSerializationMock
5454
s << nUBuckets;
5555

5656
CAddress addr = CAddress(CService("252.1.1.1", 7777), NODE_NONE);
57-
CAddrInfo info = CAddrInfo(addr, CNetAddr("252.2.2.2"));
57+
CNetAddr resolved;
58+
LookupHost("252.2.2.2", resolved, false);
59+
CAddrInfo info = CAddrInfo(addr, resolved);
5860
s << info;
5961
}
6062
};

0 commit comments

Comments
 (0)