Skip to content

Commit d342d12

Browse files
committed
evo: fast-fail MnNetInfo::AddEntry() if invalid characters found
1 parent 88b69c4 commit d342d12

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
@@ -174,8 +186,16 @@ NetInfoStatus MnNetInfo::AddEntry(const std::string& input)
174186
if (!IsEmpty()) {
175187
return NetInfoStatus::MaxLimit;
176188
}
177-
if (auto service = Lookup(input, /*portDefault=*/Params().GetDefaultPort(), /*fAllowLookup=*/false);
178-
service.has_value()) {
189+
190+
std::string addr;
191+
uint16_t port{Params().GetDefaultPort()};
192+
SplitHostPort(input, port, addr);
193+
// Contains invalid characters, unlikely to pass Lookup(), fast-fail
194+
if (!MatchCharsFilter(addr, SAFE_CHARS_IPV4)) {
195+
return NetInfoStatus::BadInput;
196+
}
197+
198+
if (auto service = Lookup(addr, /*portDefault=*/port, /*fAllowLookup=*/false); service.has_value()) {
179199
const auto ret = ValidateService(service.value());
180200
if (ret == NetInfoStatus::Success) {
181201
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)