From 1ad6f8250a4c1b0528ed866fc5b102d36a6f27ae Mon Sep 17 00:00:00 2001 From: Gaurav Kumar Garg Date: Mon, 6 Mar 2017 16:05:48 +0100 Subject: [PATCH] rbd: rbd CLI should validate snap name optionals Currently when user create snapshot by providing --snap argument in command line than rbd CLI does not validating snapshot name to ensure that it should not contain "@" or "/" character. Fix is to add validation logic for validating "@" or "/" character. Fixes: http://tracker.ceph.com/issues/14535 Reported-by: Jason Dillaman Signed-off-by: Gaurav Kumar Garg --- src/tools/rbd/Utils.cc | 24 ++++++++++++++++++++++-- src/tools/rbd/Utils.h | 3 ++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/tools/rbd/Utils.cc b/src/tools/rbd/Utils.cc index 7a1c9d36ef38..97bdd4ec1fdd 100644 --- a/src/tools/rbd/Utils.cc +++ b/src/tools/rbd/Utils.cc @@ -380,8 +380,18 @@ int get_pool_image_snapshot_names(const po::variables_map &vm, return -EINVAL; } + //Validate pool name while creating/renaming/copying/cloning/importing/etc image + if (spec_validation == SPEC_VALIDATION_FULL) { + boost::regex pattern("^[^@/]*?$"); + if (!boost::regex_match (*pool_name, pattern)) { + std::cerr << "rbd: invalid spec '" << *pool_name << "'" << std::endl; + return -EINVAL; + } + } + if (snap_name != nullptr) { - r = validate_snapshot_name(mod, *snap_name, snapshot_presence); + r = validate_snapshot_name(mod, *snap_name, snapshot_presence, + spec_validation); if (r < 0) { return r; } @@ -492,7 +502,8 @@ int get_pool_journal_names(const po::variables_map &vm, int validate_snapshot_name(at::ArgumentModifier mod, const std::string &snap_name, - SnapshotPresence snapshot_presence) { + SnapshotPresence snapshot_presence, + SpecValidation spec_validation) { std::string prefix = at::get_description_prefix(mod); switch (snapshot_presence) { case SNAPSHOT_PRESENCE_PERMITTED: @@ -515,6 +526,15 @@ int validate_snapshot_name(at::ArgumentModifier mod, } break; } + + if (spec_validation == SPEC_VALIDATION_SNAP) { + // disallow "/" and "@" in snap name + boost::regex pattern("^[^@/]*?$"); + if (!boost::regex_match (snap_name, pattern)) { + std::cerr << "rbd: invalid spec '" << snap_name << "'" << std::endl; + return -EINVAL; + } + } return 0; } diff --git a/src/tools/rbd/Utils.h b/src/tools/rbd/Utils.h index bc23a2f0c58c..184bb8e721bf 100644 --- a/src/tools/rbd/Utils.h +++ b/src/tools/rbd/Utils.h @@ -107,7 +107,8 @@ int get_pool_journal_names( int validate_snapshot_name(argument_types::ArgumentModifier mod, const std::string &snap_name, - SnapshotPresence snapshot_presence); + SnapshotPresence snapshot_presence, + SpecValidation spec_validation); int get_image_options(const boost::program_options::variables_map &vm, bool get_format, librbd::ImageOptions* opts); -- 2.47.3