From: Sage Weil Date: Thu, 10 Jan 2019 19:26:00 +0000 (-0600) Subject: msg/msg_types: entity_addrvec_t: allow brackets when parsing addrvec to match output X-Git-Tag: v14.1.0~357^2~6 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=e3783c666b4d7f0b7ae201aff5a5408a262fb26d;p=ceph-ci.git msg/msg_types: entity_addrvec_t: allow brackets when parsing addrvec to match output Signed-off-by: Sage Weil --- diff --git a/src/msg/msg_types.cc b/src/msg/msg_types.cc index 37146ad2b75..d03b3a52f28 100644 --- a/src/msg/msg_types.cc +++ b/src/msg/msg_types.cc @@ -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(); } diff --git a/src/test/test_addrs.cc b/src/test/test_addrs.cc index 13be03cdcdc..6a7ba8f628d 100644 --- a/src/test/test_addrs.cc +++ b/src/test/test_addrs.cc @@ -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 }, };