From: Casey Bodley Date: Thu, 1 Nov 2018 20:17:11 +0000 (-0400) Subject: rgw: beast frontend parses ipv6 addrs X-Git-Tag: v12.2.11~77^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=baec2e5cfea0559965837519bf2e409a22b847ef;p=ceph.git rgw: beast frontend parses ipv6 addrs Fixes: http://tracker.ceph.com/issues/36662 Signed-off-by: Casey Bodley (cherry picked from commit a3b4124fd258887ff4cb3f65967f593658a41f4f) --- diff --git a/doc/radosgw/frontends.rst b/doc/radosgw/frontends.rst index 7e45987815d4..7c0b2cced830 100644 --- a/doc/radosgw/frontends.rst +++ b/doc/radosgw/frontends.rst @@ -31,10 +31,10 @@ Options :Description: Sets the listening address in the form ``address[:port]``, where the address is an IPv4 address string in dotted decimal - form, or an IPv6 address in hexadecimal notation. The - optional port defaults to 80 for ``endpoint`` and 443 for - ``ssl_endpoint``. Can be specified multiple times as in - ``endpoint=::1 endpoint=192.168.0.100:8000``. + form, or an IPv6 address in hexadecimal notation surrounded + by square brackets. The optional port defaults to 80 for + ``endpoint`` and 443 for ``ssl_endpoint``. Can be specified + multiple times as in ``endpoint=[::1] endpoint=192.168.0.100:8000``. :Type: Integer :Default: None diff --git a/src/rgw/rgw_asio_frontend.cc b/src/rgw/rgw_asio_frontend.cc index b52720f73778..e974ae7bf8e0 100644 --- a/src/rgw/rgw_asio_frontend.cc +++ b/src/rgw/rgw_asio_frontend.cc @@ -262,16 +262,41 @@ tcp::endpoint parse_endpoint(BOOST_ASIO_STRING_VIEW_PARAM input, { tcp::endpoint endpoint; - auto colon = input.find(':'); - if (colon != input.npos) { - auto port_str = input.substr(colon + 1); - endpoint.port(parse_port(port_str.data(), ec)); - } else { - endpoint.port(default_port); + if (input.empty()) { + ec = boost::asio::error::invalid_argument; + return endpoint; } - if (!ec) { + + if (input[0] == '[') { // ipv6 + const size_t addr_begin = 1; + const size_t addr_end = input.find(']'); + if (addr_end == input.npos) { // no matching ] + ec = boost::asio::error::invalid_argument; + return endpoint; + } + if (addr_end + 1 < input.size()) { + // :port must must follow [ipv6] + if (input[addr_end + 1] != ':') { + ec = boost::asio::error::invalid_argument; + return endpoint; + } else { + auto port_str = input.substr(addr_end + 2); + endpoint.port(parse_port(port_str.data(), ec)); + } + } + auto addr = input.substr(addr_begin, addr_end - addr_begin); + endpoint.address(boost::asio::ip::make_address_v6(addr, ec)); + } else { // ipv4 + auto colon = input.find(':'); + if (colon != input.npos) { + auto port_str = input.substr(colon + 1); + endpoint.port(parse_port(port_str.data(), ec)); + if (ec) { + return endpoint; + } + } auto addr = input.substr(0, colon); - endpoint.address(boost::asio::ip::make_address(addr, ec)); + endpoint.address(boost::asio::ip::make_address_v4(addr, ec)); } return endpoint; }