Skip to content

Commit 66ee55c

Browse files
committed
evo: fast-fail MnNetInfo::AddEntry() if invalid characters found
1 parent e0c63ab commit 66ee55c

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

src/evo/netinfo.cpp

+22-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ static std::unique_ptr<const CChainParams> g_main_params{nullptr};
1515
static std::once_flag g_main_params_flag;
1616
static const CService empty_service{CService()};
1717

18+
static constexpr std::string_view SAFE_CHARS_IPV4{"1234567890."};
19+
1820
bool IsNodeOnMainnet() { return Params().NetworkIDString() == CBaseChainParams::MAIN; }
1921
const CChainParams& MainParams()
2022
{
@@ -23,6 +25,16 @@ const CChainParams& MainParams()
2325
[&]() { g_main_params = CreateChainParams(ArgsManager{}, CBaseChainParams::MAIN); });
2426
return *Assert(g_main_params);
2527
}
28+
29+
bool MatchCharsFilter(const std::string& input, const std::string_view& filter)
30+
{
31+
for (char c : input) {
32+
if (filter.find(c) == std::string::npos) {
33+
return false;
34+
}
35+
}
36+
return true;
37+
}
2638
} // anonymous namespace
2739

2840
bool NetInfoEntry::operator==(const NetInfoEntry& rhs) const
@@ -162,8 +174,16 @@ NetInfoStatus MnNetInfo::AddEntry(const std::string& input)
162174
if (!IsEmpty()) {
163175
return NetInfoStatus::MaxLimit;
164176
}
165-
if (auto service = Lookup(input, /*portDefault=*/Params().GetDefaultPort(), /*fAllowLookup=*/false);
166-
service.has_value()) {
177+
178+
std::string addr;
179+
uint16_t port{Params().GetDefaultPort()};
180+
SplitHostPort(input, port, addr);
181+
// Contains invalid characters, unlikely to pass Lookup(), fast-fail
182+
if (!MatchCharsFilter(addr, SAFE_CHARS_IPV4)) {
183+
return NetInfoStatus::BadInput;
184+
}
185+
186+
if (auto service = Lookup(addr, /*portDefault=*/port, /*fAllowLookup=*/false); service.has_value()) {
167187
const auto ret = ValidateService(service.value());
168188
if (ret == NetInfoStatus::Success) {
169189
m_addr = NetInfoEntry{service.value()};

src/test/evo_netinfo_tests.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const std::vector<std::pair</*input=*/std::string, /*expected_ret=*/NetInfoStatu
2727
// Port greater than uint16_t max
2828
{"1.1.1.1:99999", NetInfoStatus::BadInput},
2929
// Only IPv4 allowed
30-
{"[2606:4700:4700::1111]:9999", NetInfoStatus::BadType},
30+
{"[2606:4700:4700::1111]:9999", NetInfoStatus::BadInput},
3131
// Domains are not allowed
3232
{"example.com:9999", NetInfoStatus::BadInput},
3333
// Incorrect IPv4 address
@@ -105,7 +105,7 @@ BOOST_AUTO_TEST_CASE(cservice_compatible)
105105
// Validation failure (non-IPv4 not allowed), MnNetInfo should remain empty if ValidateService() failed
106106
service = CService();
107107
netInfo.Clear();
108-
BOOST_CHECK_EQUAL(netInfo.AddEntry("[2606:4700:4700::1111]:9999"), NetInfoStatus::BadType);
108+
BOOST_CHECK_EQUAL(netInfo.AddEntry("[2606:4700:4700::1111]:9999"), NetInfoStatus::BadInput);
109109
BOOST_CHECK(CheckIfSerSame(service, netInfo));
110110
}
111111

0 commit comments

Comments
 (0)