]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: beast frontend parses ipv6 addrs
authorCasey Bodley <cbodley@redhat.com>
Thu, 1 Nov 2018 20:17:11 +0000 (16:17 -0400)
committerCasey Bodley <cbodley@redhat.com>
Thu, 1 Nov 2018 20:24:37 +0000 (16:24 -0400)
Fixes: http://tracker.ceph.com/issues/36662
Signed-off-by: Casey Bodley <cbodley@redhat.com>
doc/radosgw/frontends.rst
src/rgw/rgw_asio_frontend.cc

index 742431e6f745df78c070900a9701e320ba4568a4..edc2d0a1fde862ef0643077263bdf503c5b6e24d 100644 (file)
@@ -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
index e687da00e5a61af719e8ff5958091c057c717c76..87c3a416669e98dafa1b460c64538057efa1b2a9 100644 (file)
@@ -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;
 }