@@ -12,13 +12,25 @@ namespace {
1212static std::unique_ptr<const CChainParams> g_main_params{nullptr };
1313static const CService empty_service{CService ()};
1414
15+ static constexpr std::string_view SAFE_CHARS_IPV4{" 1234567890." };
16+
1517bool IsNodeOnMainnet () { return Params ().NetworkIDString () == CBaseChainParams::MAIN; }
1618const 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
2436bool NetInfoEntry::operator ==(const NetInfoEntry& rhs) const
@@ -148,8 +160,16 @@ NetInfoStatus MnNetInfo::AddEntry(const std::string& input)
148160 if (!IsEmpty ()) {
149161 return NetInfoStatus::MaxLimit;
150162 }
151- if (auto service = Lookup (input, /* portDefault=*/ Params ().GetDefaultPort (), /* fAllowLookup=*/ false );
152- service.has_value ()) {
163+
164+ std::string addr;
165+ uint16_t port{Params ().GetDefaultPort ()};
166+ SplitHostPort (input, port, addr);
167+ // Contains invalid characters, unlikely to pass Lookup(), fast-fail
168+ if (!MatchCharsFilter (addr, SAFE_CHARS_IPV4)) {
169+ return NetInfoStatus::BadInput;
170+ }
171+
172+ if (auto service = Lookup (addr, /* portDefault=*/ port, /* fAllowLookup=*/ false ); service.has_value ()) {
153173 const auto ret = ValidateService (service.value ());
154174 if (ret == NetInfoStatus::Success) {
155175 m_addr = NetInfoEntry{service.value ()};
0 commit comments