]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/msg_types: entity_addrvec_t: allow brackets when parsing addrvec to match output
authorSage Weil <sage@redhat.com>
Thu, 10 Jan 2019 19:26:00 +0000 (13:26 -0600)
committerSage Weil <sage@redhat.com>
Wed, 16 Jan 2019 14:31:43 +0000 (08:31 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/msg/msg_types.cc
src/test/test_addrs.cc

index 37146ad2b75ac7f6111b67fd10927c162cee0e42..d03b3a52f287696df72cde9c93d333e122c8f46c 100644 (file)
@@ -229,6 +229,7 @@ ostream& operator<<(ostream& out, const sockaddr *sa)
 
 bool entity_addrvec_t::parse(const char *s, const char **end)
 {
+  const char *orig_s = s;
   const char *static_end;
   if (!end) {
     end = &static_end;
@@ -236,10 +237,26 @@ bool entity_addrvec_t::parse(const char *s, const char **end)
     *end = s;
   }
   v.clear();
+  bool brackets = false;
+  if (*s == '[') {
+    // weirdness: make sure this isn't an IPV6 addr!
+    entity_addr_t a;
+    const char *p;
+    if (!a.parse(s, &p) || !a.is_ipv6()) {
+      // it's not
+      brackets = true;
+      ++s;
+    }
+  }
   while (*s) {
     entity_addr_t a;
     bool r = a.parse(s, end);
     if (!r) {
+      if (brackets) {
+       v.clear();
+       *end = orig_s;
+       return false;
+      }
       break;
     }
     v.push_back(a);
@@ -249,6 +266,16 @@ bool entity_addrvec_t::parse(const char *s, const char **end)
     }
     ++s;
   }
+  if (brackets) {
+    if (*s == ']') {
+      ++s;
+      *end = s;
+    } else {
+      *end = orig_s;
+      v.clear();
+      return false;
+    }
+  }
   return !v.empty();
 }
 
index 13be03cdcdc03cba262f78f17d3eb2f71cf33e05..6a7ba8f628d5c11a96cca71a80f5ed83f75b3c30 100644 (file)
@@ -253,10 +253,19 @@ TEST(Msgr, TestAddrvecEncodeAddrDecode3)
 }
 
 const char *addrvec_parse_checks[][3] = {
+  { "", "", "" },
+  { "foo", "", "foo" },
+  { " foo", "", " foo" },
   { "127.0.0.1", "v2:127.0.0.1:0/0", "" },
   { "127.0.0.1 foo", "v2:127.0.0.1:0/0", " foo" },
   { "127.0.0.1,1.2.3.4 foo", "[v2:127.0.0.1:0/0,v2:1.2.3.4:0/0]", " foo" },
   { "127.0.0.1,::,- foo", "[v2:127.0.0.1:0/0,v2:[::]:0/0,-]", " foo" },
+  { "[127.0.0.1,::,-] foo", "[v2:127.0.0.1:0/0,v2:[::]:0/0,-]", " foo" },
+  { "[127.0.0.1,::],- foo", "[v2:127.0.0.1:0/0,v2:[::]:0/0]", ",- foo" },
+  { "[1.2.3.4,::,foo]", "", "[1.2.3.4,::,foo]" },
+  { "[1.2.3.4,::,- foo", "", "[1.2.3.4,::,- foo" },
+  { "[[::],1.2.3.4]", "[v2:[::]:0/0,v2:1.2.3.4:0/0]", "" },
+  { "[::],1.2.3.4", "[v2:[::]:0/0,v2:1.2.3.4:0/0]", "" },
   { NULL, NULL, NULL },
 };