diff --git a/src/netbase.cpp b/src/netbase.cpp index a5da1c9dcef..1f3faa18643 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -829,10 +829,9 @@ CSubNet LookupSubNet(const std::string& subnet_str) addr = static_cast(MaybeFlipIPv6toCJDNS(CService{addr.value(), /*port=*/0})); if (slash_pos != subnet_str.npos) { const std::string netmask_str{subnet_str.substr(slash_pos + 1)}; - uint8_t netmask; - if (ParseUInt8(netmask_str, &netmask)) { + if (const auto netmask{ToIntegral(netmask_str)}) { // Valid number; assume CIDR variable-length subnet masking. - subnet = CSubNet{addr.value(), netmask}; + subnet = CSubNet{addr.value(), *netmask}; } else { // Invalid number; try full netmask syntax. Never allow lookup for netmask. const std::optional full_netmask{LookupHost(netmask_str, /*fAllowLookup=*/false)}; diff --git a/src/test/netbase_tests.cpp b/src/test/netbase_tests.cpp index 3422cb80233..7da87bd17fa 100644 --- a/src/test/netbase_tests.cpp +++ b/src/test/netbase_tests.cpp @@ -150,7 +150,6 @@ BOOST_AUTO_TEST_CASE(embedded_test) BOOST_AUTO_TEST_CASE(subnet_test) { - BOOST_CHECK(LookupSubNet("1.2.3.0/24") == LookupSubNet("1.2.3.0/255.255.255.0")); BOOST_CHECK(LookupSubNet("1.2.3.0/24") != LookupSubNet("1.2.4.0/255.255.255.0")); BOOST_CHECK(LookupSubNet("1.2.3.0/24").Match(ResolveIP("1.2.3.4"))); @@ -185,6 +184,7 @@ BOOST_AUTO_TEST_CASE(subnet_test) // Check valid/invalid BOOST_CHECK(LookupSubNet("1.2.3.0/0").IsValid()); BOOST_CHECK(!LookupSubNet("1.2.3.0/-1").IsValid()); + BOOST_CHECK(!LookupSubNet("1.2.3.0/+24").IsValid()); BOOST_CHECK(LookupSubNet("1.2.3.0/32").IsValid()); BOOST_CHECK(!LookupSubNet("1.2.3.0/33").IsValid()); BOOST_CHECK(!LookupSubNet("1.2.3.0/300").IsValid());