Skip to content

Commit 6d0bd5b

Browse files
committed
net: do not allow resolving to an internal address
In order to prevent mixups, our internal range is never allowed as a resolve result. This means that no user-provided string will ever be confused with an internal address.
1 parent 7f31762 commit 6d0bd5b

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

src/netbase.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,17 +108,22 @@ bool static LookupIntern(const char *pszName, std::vector<CNetAddr>& vIP, unsign
108108
struct addrinfo *aiTrav = aiRes;
109109
while (aiTrav != NULL && (nMaxSolutions == 0 || vIP.size() < nMaxSolutions))
110110
{
111+
CNetAddr resolved;
111112
if (aiTrav->ai_family == AF_INET)
112113
{
113114
assert(aiTrav->ai_addrlen >= sizeof(sockaddr_in));
114-
vIP.push_back(CNetAddr(((struct sockaddr_in*)(aiTrav->ai_addr))->sin_addr));
115+
resolved = CNetAddr(((struct sockaddr_in*)(aiTrav->ai_addr))->sin_addr);
115116
}
116117

117118
if (aiTrav->ai_family == AF_INET6)
118119
{
119120
assert(aiTrav->ai_addrlen >= sizeof(sockaddr_in6));
120121
struct sockaddr_in6* s6 = (struct sockaddr_in6*) aiTrav->ai_addr;
121-
vIP.push_back(CNetAddr(s6->sin6_addr, s6->sin6_scope_id));
122+
resolved = CNetAddr(s6->sin6_addr, s6->sin6_scope_id);
123+
}
124+
/* Never allow resolving to an internal address. Consider any such result invalid */
125+
if (!resolved.IsInternal()) {
126+
vIP.push_back(resolved);
122127
}
123128

124129
aiTrav = aiTrav->ai_next;

src/test/netbase_tests.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ BOOST_AUTO_TEST_CASE(netbase_lookupnumeric)
113113
BOOST_CHECK(TestParse("[::]:8333", "[::]:8333"));
114114
BOOST_CHECK(TestParse("[127.0.0.1]", "127.0.0.1:65535"));
115115
BOOST_CHECK(TestParse(":::", "[::]:0"));
116+
117+
// verify that an internal address fails to resolve
118+
BOOST_CHECK(TestParse("[fd6b:88c0:8724:1:2:3:4:5]", "[::]:0"));
119+
// and that a one-off resolves correctly
120+
BOOST_CHECK(TestParse("[fd6c:88c0:8724:1:2:3:4:5]", "[fd6c:88c0:8724:1:2:3:4:5]:65535"));
116121
}
117122

118123
BOOST_AUTO_TEST_CASE(onioncat_test)

0 commit comments

Comments
 (0)