@@ -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{};
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,11 @@ const CChainParams& MainParams()
2325                   [&]() { g_main_params = CreateChainParams (ArgsManager{}, CBaseChainParams::MAIN); });
2426    return  *Assert (g_main_params);
2527}
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+ }
2633} //  anonymous namespace
2734
2835bool  NetInfoEntry::operator ==(const  NetInfoEntry& rhs) const 
@@ -166,7 +173,16 @@ NetInfoStatus MnNetInfo::AddEntry(const std::string& input)
166173    if  (!IsEmpty ()) {
167174        return  NetInfoStatus::MaxLimit;
168175    }
169-     if  (auto  service_opt{Lookup (input, /* portDefault=*/ Params ().GetDefaultPort (), /* fAllowLookup=*/ false )}) {
176+ 
177+     std::string addr;
178+     uint16_t  port{Params ().GetDefaultPort ()};
179+     SplitHostPort (input, port, addr);
180+     //  Contains invalid characters, unlikely to pass Lookup(), fast-fail
181+     if  (!MatchCharsFilter (addr, SAFE_CHARS_IPV4)) {
182+         return  NetInfoStatus::BadInput;
183+     }
184+ 
185+     if  (auto  service_opt{Lookup (addr, /* portDefault=*/  port, /* fAllowLookup=*/ false )}) {
170186        const  auto  ret{ValidateService (*service_opt)};
171187        if  (ret == NetInfoStatus::Success) {
172188            m_addr = NetInfoEntry{*service_opt};
0 commit comments