@@ -15,6 +15,8 @@ static std::unique_ptr<const CChainParams> g_main_params{nullptr};
15
15
static std::once_flag g_main_params_flag;
16
16
static const CService empty_service{CService ()};
17
17
18
+ static constexpr std::string_view SAFE_CHARS_IPV4{" 1234567890." };
19
+
18
20
bool IsNodeOnMainnet () { return Params ().NetworkIDString () == CBaseChainParams::MAIN; }
19
21
const CChainParams& MainParams ()
20
22
{
@@ -23,6 +25,11 @@ const CChainParams& MainParams()
23
25
[&]() { g_main_params = CreateChainParams (ArgsManager{}, CBaseChainParams::MAIN); });
24
26
return *Assert (g_main_params);
25
27
}
28
+
29
+ bool MatchCharsFilter (std::string_view input, std::string_view filter)
30
+ {
31
+ return std::all_of (input.begin (), input.end (), [&filter](char c) { return filter.find (c) != std::string_view::npos; });
32
+ }
26
33
} // anonymous namespace
27
34
28
35
bool NetInfoEntry::operator ==(const NetInfoEntry& rhs) const
@@ -176,7 +183,16 @@ NetInfoStatus MnNetInfo::AddEntry(const std::string& input)
176
183
if (!IsEmpty ()) {
177
184
return NetInfoStatus::MaxLimit;
178
185
}
179
- if (auto service_opt{Lookup (input, /* portDefault=*/ Params ().GetDefaultPort (), /* fAllowLookup=*/ false )}) {
186
+
187
+ std::string addr;
188
+ uint16_t port{Params ().GetDefaultPort ()};
189
+ SplitHostPort (input, port, addr);
190
+ // Contains invalid characters, unlikely to pass Lookup(), fast-fail
191
+ if (!MatchCharsFilter (addr, SAFE_CHARS_IPV4)) {
192
+ return NetInfoStatus::BadInput;
193
+ }
194
+
195
+ if (auto service_opt{Lookup (addr, /* portDefault=*/ port, /* fAllowLookup=*/ false )}) {
180
196
const auto ret{ValidateService (*service_opt)};
181
197
if (ret == NetInfoStatus::Success) {
182
198
m_addr = NetInfoEntry{*service_opt};
0 commit comments