mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-21 14:34:49 +01:00
Validate port value in SplitHostPort
Forward the validation of the port from `ParseUInt16(...)`. Consider port 0 as invalid. Add suitable test for the `SplitHostPort` function. Add doxygen description to the `SplitHostPort` function.
This commit is contained in:
parent
5e82b9ba96
commit
f8387c4234
3 changed files with 37 additions and 5 deletions
|
@ -84,12 +84,12 @@ BOOST_AUTO_TEST_CASE(netbase_properties)
|
|||
|
||||
}
|
||||
|
||||
bool static TestSplitHost(const std::string& test, const std::string& host, uint16_t port)
|
||||
bool static TestSplitHost(const std::string& test, const std::string& host, uint16_t port, bool validPort=true)
|
||||
{
|
||||
std::string hostOut;
|
||||
uint16_t portOut{0};
|
||||
SplitHostPort(test, portOut, hostOut);
|
||||
return hostOut == host && port == portOut;
|
||||
bool validPortOut = SplitHostPort(test, portOut, hostOut);
|
||||
return hostOut == host && portOut == port && validPortOut == validPort;
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(netbase_splithost)
|
||||
|
@ -109,6 +109,23 @@ BOOST_AUTO_TEST_CASE(netbase_splithost)
|
|||
BOOST_CHECK(TestSplitHost(":8333", "", 8333));
|
||||
BOOST_CHECK(TestSplitHost("[]:8333", "", 8333));
|
||||
BOOST_CHECK(TestSplitHost("", "", 0));
|
||||
BOOST_CHECK(TestSplitHost(":65535", "", 65535));
|
||||
BOOST_CHECK(TestSplitHost(":65536", ":65536", 0, false));
|
||||
BOOST_CHECK(TestSplitHost(":-1", ":-1", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("[]:70001", "[]:70001", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("[]:-1", "[]:-1", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("[]:-0", "[]:-0", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("[]:0", "", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("[]:1/2", "[]:1/2", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("[]:1E2", "[]:1E2", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("127.0.0.1:65536", "127.0.0.1:65536", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("127.0.0.1:0", "127.0.0.1", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("127.0.0.1:", "127.0.0.1:", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("127.0.0.1:1/2", "127.0.0.1:1/2", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("127.0.0.1:1E2", "127.0.0.1:1E2", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("www.bitcoincore.org:65536", "www.bitcoincore.org:65536", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("www.bitcoincore.org:0", "www.bitcoincore.org", 0, false));
|
||||
BOOST_CHECK(TestSplitHost("www.bitcoincore.org:", "www.bitcoincore.org:", 0, false));
|
||||
}
|
||||
|
||||
bool static TestParse(std::string src, std::string canon)
|
||||
|
|
|
@ -97,8 +97,9 @@ std::vector<Byte> ParseHex(std::string_view str)
|
|||
template std::vector<std::byte> ParseHex(std::string_view);
|
||||
template std::vector<uint8_t> ParseHex(std::string_view);
|
||||
|
||||
void SplitHostPort(std::string_view in, uint16_t& portOut, std::string& hostOut)
|
||||
bool SplitHostPort(std::string_view in, uint16_t& portOut, std::string& hostOut)
|
||||
{
|
||||
bool valid = false;
|
||||
size_t colon = in.find_last_of(':');
|
||||
// if a : is found, and it either follows a [...], or no other : is in the string, treat it as port separator
|
||||
bool fHaveColon = colon != in.npos;
|
||||
|
@ -109,13 +110,18 @@ void SplitHostPort(std::string_view in, uint16_t& portOut, std::string& hostOut)
|
|||
if (ParseUInt16(in.substr(colon + 1), &n)) {
|
||||
in = in.substr(0, colon);
|
||||
portOut = n;
|
||||
valid = (portOut != 0);
|
||||
}
|
||||
} else {
|
||||
valid = true;
|
||||
}
|
||||
if (in.size() > 0 && in[0] == '[' && in[in.size() - 1] == ']') {
|
||||
hostOut = in.substr(1, in.size() - 2);
|
||||
} else {
|
||||
hostOut = in;
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
std::string EncodeBase64(Span<const unsigned char> input)
|
||||
|
|
|
@ -88,7 +88,16 @@ std::string EncodeBase32(Span<const unsigned char> input, bool pad = true);
|
|||
*/
|
||||
std::string EncodeBase32(std::string_view str, bool pad = true);
|
||||
|
||||
void SplitHostPort(std::string_view in, uint16_t& portOut, std::string& hostOut);
|
||||
/**
|
||||
* Splits socket address string into host string and port value.
|
||||
* Validates port value.
|
||||
*
|
||||
* @param[in] in The socket address string to split.
|
||||
* @param[out] portOut Port-portion of the input, if found and parsable.
|
||||
* @param[out] hostOut Host-portion of the input, if found.
|
||||
* @return true if port-portion is absent or within its allowed range, otherwise false
|
||||
*/
|
||||
bool SplitHostPort(std::string_view in, uint16_t& portOut, std::string& hostOut);
|
||||
|
||||
// LocaleIndependentAtoi is provided for backwards compatibility reasons.
|
||||
//
|
||||
|
|
Loading…
Add table
Reference in a new issue