From: Brad Hubbard Date: Wed, 25 Nov 2020 01:57:37 +0000 (+1000) Subject: monmaptool: Don't call set_port on an invalid address X-Git-Tag: v15.2.13~10^2~10^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=161612f03b689aea492da56e6a6f37e1bf82018c;p=ceph.git monmaptool: Don't call set_port on an invalid address Verify we parse the entire address argument. Fixes: https://tracker.ceph.com/issues/48336 Signed-off-by: Brad Hubbard Signed-off-by: Kefu Chai (cherry picked from commit c0aa1fdbe7b87c2fb4b572169372ec487950b03d) --- diff --git a/src/msg/msg_types.cc b/src/msg/msg_types.cc index a02d95c14ce5..068d45a46433 100644 --- a/src/msg/msg_types.cc +++ b/src/msg/msg_types.cc @@ -62,6 +62,14 @@ void entity_inst_t::generate_test_instances(list& o) o.push_back(a); } +bool entity_addr_t::parse(const std::string_view s) +{ + const char* start = s.data(); + const char* end = nullptr; + bool got = parse(start, &end); + return got && end == start + s.size(); +} + bool entity_addr_t::parse(const char *s, const char **end, int default_type) { *this = entity_addr_t(); diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index 3016d2c53fc7..db1f20720a94 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -440,6 +440,7 @@ struct entity_addr_t { return ss.str(); } + bool parse(const std::string_view s); bool parse(const char *s, const char **end = 0, int type=0); void decode_legacy_addr_after_marker(ceph::buffer::list::const_iterator& bl) diff --git a/src/tools/monmaptool.cc b/src/tools/monmaptool.cc index ad41bfb14d80..7dd905538cbd 100644 --- a/src/tools/monmaptool.cc +++ b/src/tools/monmaptool.cc @@ -230,7 +230,8 @@ int main(int argc, const char **argv) if (i == args.end()) helpful_exit(); entity_addr_t addr; - if (!addr.parse(*i)) { + if (!addr.parse(string_view{*i})) { + // Either we couldn't parse the address or we didn't consume the entire token cerr << me << ": invalid ip:port '" << *i << "'" << std::endl; return -1; }