]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: rbd CLI should validate snap name optionals 13836/head
authorGaurav Kumar Garg <garg.gaurav52@gmail.com>
Mon, 6 Mar 2017 15:05:48 +0000 (16:05 +0100)
committerGaurav Kumar Garg <garg.gaurav52@gmail.com>
Tue, 14 Mar 2017 13:25:07 +0000 (14:25 +0100)
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 <dillaman@redhat.com>
Signed-off-by: Gaurav Kumar Garg <garg.gaurav52@gmail.com>
src/tools/rbd/Utils.cc
src/tools/rbd/Utils.h

index 7a1c9d36ef38728ae96942a4d1851e4db07fbd4c..97bdd4ec1fddd96654bc587600831d381c87e28c 100644 (file)
@@ -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;
 }
 
index bc23a2f0c58c76e34865175b8b9f9b84a84825c7..184bb8e721bfd872113c20badce1c69d13c0693f 100644 (file)
@@ -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);