Skip to content

Commit e80d431

Browse files
committed
evo: fast-fail MnNetInfo::AddEntry() if invalid characters found
1 parent 8eaf84b commit e80d431

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

src/evo/netinfo.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,25 @@ namespace {
1212
static std::unique_ptr<const CChainParams> g_main_params{nullptr};
1313
static const CService empty_service{CService()};
1414

15-
bool IsNodeOnMainnet() { return Params().NetworkIDString() == CBaseChainParams::MAIN; }
15+
static constexpr std::string_view SAFE_CHARS_IPPORT{"1234567890.[]:"};
16+
17+
const bool IsNodeOnMainnet() { return Params().NetworkIDString() == CBaseChainParams::MAIN; }
1618
const CChainParams& MainParams()
1719
{
1820
// TODO: use real args here
1921
if (!g_main_params) g_main_params = CreateChainParams(ArgsManager{}, CBaseChainParams::MAIN);
2022
return *g_main_params;
2123
}
24+
25+
bool MatchCharsFilter(const std::string& input, const std::string_view& filter)
26+
{
27+
for (char c : input) {
28+
if (filter.find(c) == std::string::npos) {
29+
return false;
30+
}
31+
}
32+
return true;
33+
}
2234
} // anonymous namespace
2335

2436
bool NetInfoEntry::operator==(const NetInfoEntry& rhs) const
@@ -148,6 +160,10 @@ NetInfoStatus MnNetInfo::AddEntry(const std::string& input)
148160
if (!IsEmpty()) {
149161
return NetInfoStatus::MaxLimit;
150162
}
163+
// Contains invalid characters, unlikely to pass Lookup(), fast-fail
164+
if (!MatchCharsFilter(input, SAFE_CHARS_IPPORT)) {
165+
return NetInfoStatus::BadInput;
166+
}
151167
if (auto service = Lookup(input, /*portDefault=*/Params().GetDefaultPort(), /*fAllowLookup=*/false);
152168
service.has_value()) {
153169
const auto ret = ValidateService(service.value());

0 commit comments

Comments
 (0)