From c0aa1fdbe7b87c2fb4b572169372ec487950b03d Mon Sep 17 00:00:00 2001 From: Brad Hubbard Date: Wed, 25 Nov 2020 11:57:37 +1000 Subject: [PATCH] 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 --- src/msg/msg_types.cc | 8 ++++++++ src/msg/msg_types.h | 1 + src/tools/monmaptool.cc | 3 ++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/msg/msg_types.cc b/src/msg/msg_types.cc index 50a75cc86d059..330cfba5bc35a 100644 --- a/src/msg/msg_types.cc +++ b/src/msg/msg_types.cc @@ -64,6 +64,14 @@ void entity_inst_t::generate_test_instances(std::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 cf0574972d30d..bb26d3d55baeb 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -438,6 +438,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 94aea46ad109e..23962997d218c 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; } -- 2.39.5