@@ -15,6 +15,8 @@ static std::unique_ptr<const CChainParams> g_main_params{nullptr};
1515static std::once_flag g_main_params_flag;
1616static const CService empty_service{CService ()};
1717
18+ static constexpr std::string_view SAFE_CHARS_IPV4{" 1234567890." };
19+
1820bool IsNodeOnMainnet () { return Params ().NetworkIDString () == CBaseChainParams::MAIN; }
1921const 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
2840bool NetInfoEntry::operator ==(const NetInfoEntry& rhs) const
@@ -151,8 +163,16 @@ NetInfoStatus MnNetInfo::AddEntry(const std::string& input)
151163 if (!IsEmpty ()) {
152164 return NetInfoStatus::MaxLimit;
153165 }
154- if (auto service = Lookup (input, /* portDefault=*/ Params ().GetDefaultPort (), /* fAllowLookup=*/ false );
155- service.has_value ()) {
166+
167+ std::string addr;
168+ uint16_t port{Params ().GetDefaultPort ()};
169+ SplitHostPort (input, port, addr);
170+ // Contains invalid characters, unlikely to pass Lookup(), fast-fail
171+ if (!MatchCharsFilter (addr, SAFE_CHARS_IPV4)) {
172+ return NetInfoStatus::BadInput;
173+ }
174+
175+ if (auto service = Lookup (addr, /* portDefault=*/ port, /* fAllowLookup=*/ false ); service.has_value ()) {
156176 const auto ret = ValidateService (service.value ());
157177 if (ret == NetInfoStatus::Success) {
158178 m_addr = NetInfoEntry{service.value ()};
0 commit comments