From a3b4124fd258887ff4cb3f65967f593658a41f4f Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Thu, 1 Nov 2018 16:17:11 -0400 Subject: [PATCH] rgw: beast frontend parses ipv6 addrs Fixes: http://tracker.ceph.com/issues/36662 Signed-off-by: Casey Bodley --- doc/radosgw/frontends.rst | 8 +++---- src/rgw/rgw_asio_frontend.cc | 41 +++++++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/doc/radosgw/frontends.rst b/doc/radosgw/frontends.rst index 742431e6f74..edc2d0a1fde 100644 --- a/doc/radosgw/frontends.rst +++ b/doc/radosgw/frontends.rst @@ -33,10 +33,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 e687da00e5a..87c3a416669 100644 --- a/src/rgw/rgw_asio_frontend.cc +++ b/src/rgw/rgw_asio_frontend.cc @@ -282,16 +282,41 @@ tcp::endpoint parse_endpoint(boost::asio::string_view 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; } -- 2.39.5