@@ -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,16 @@ 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 (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
+ }
26
38
} // anonymous namespace
27
39
28
40
bool NetInfoEntry::operator ==(const NetInfoEntry& rhs) const
@@ -162,8 +174,16 @@ NetInfoStatus MnNetInfo::AddEntry(const std::string& input)
162
174
if (!IsEmpty ()) {
163
175
return NetInfoStatus::MaxLimit;
164
176
}
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 ()) {
167
187
const auto ret = ValidateService (service.value ());
168
188
if (ret == NetInfoStatus::Success) {
169
189
m_addr = NetInfoEntry{service.value ()};
0 commit comments