]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: gracefully handle extra arguments
authorDan Mick <dan.mick@inktank.com>
Fri, 5 Oct 2012 00:52:05 +0000 (17:52 -0700)
committerDan Mick <dan.mick@inktank.com>
Fri, 5 Oct 2012 01:08:28 +0000 (18:08 -0700)
Instead of looping across all args, with increments inside the loop,
which can run off the end of the vector, demand that the final
argument parsing have exactly the right number of args, or complain
about the extras and die.

Signed-off-by: Dan Mick <dan.mick@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
src/rbd.cc

index f43cb03a45ff9820eabbc3cdd23d139d2f72376e..f490c700dcb5b0df15f5680f8f9e2a3ee2731d50 100644 (file)
@@ -1344,79 +1344,87 @@ int main(int argc, const char **argv)
     return EXIT_FAILURE;
   }
 
-  for (i = args.erase(i); i != args.end(); ++i) {
-    const char *v = *i;
-    switch (opt_cmd) {
-      case OPT_LIST:
-       set_conf_param(v, &poolname, NULL);
-       break;
-      case OPT_INFO:
-      case OPT_CREATE:
-      case OPT_FLATTEN:
-      case OPT_RESIZE:
-      case OPT_RM:
-      case OPT_SNAP_CREATE:
-      case OPT_SNAP_ROLLBACK:
-      case OPT_SNAP_REMOVE:
-      case OPT_SNAP_LIST:
-      case OPT_SNAP_PURGE:
-      case OPT_SNAP_PROTECT:
-      case OPT_SNAP_UNPROTECT:
-      case OPT_WATCH:
-      case OPT_MAP:
-      case OPT_LOCK_LIST:
+  i = args.erase(i);
+  const char *v = *i;
+  switch (opt_cmd) {
+    case OPT_LIST:
+      set_conf_param(v, &poolname, NULL);
+      break;
+    case OPT_INFO:
+    case OPT_CREATE:
+    case OPT_FLATTEN:
+    case OPT_RESIZE:
+    case OPT_RM:
+    case OPT_SNAP_CREATE:
+    case OPT_SNAP_ROLLBACK:
+    case OPT_SNAP_REMOVE:
+    case OPT_SNAP_LIST:
+    case OPT_SNAP_PURGE:
+    case OPT_SNAP_PROTECT:
+    case OPT_SNAP_UNPROTECT:
+    case OPT_WATCH:
+    case OPT_MAP:
+    case OPT_LOCK_LIST:
+      set_conf_param(v, &imgname, NULL);
+      break;
+    case OPT_UNMAP:
+      set_conf_param(v, &devpath, NULL);
+      break;
+    case OPT_EXPORT:
+      set_conf_param(v, &imgname, &path);
+      break;
+    case OPT_IMPORT:
+      set_conf_param(v, &path, &destname);
+      break;
+    case OPT_COPY:
+    case OPT_RENAME:
+      set_conf_param(v, &imgname, &destname);
+      break;
+    case OPT_CLONE:
+      if (imgname == NULL) {
        set_conf_param(v, &imgname, NULL);
-       break;
-      case OPT_UNMAP:
-       set_conf_param(v, &devpath, NULL);
-       break;
-      case OPT_EXPORT:
-       set_conf_param(v, &imgname, &path);
-       break;
-      case OPT_IMPORT:
-       set_conf_param(v, &path, &destname);
-       break;
-      case OPT_COPY:
-      case OPT_RENAME:
-       set_conf_param(v, &imgname, &destname);
-       break;
-      case OPT_CLONE:
-       if (imgname == NULL) {
-         set_conf_param(v, &imgname, NULL);
-        } else {
-         set_conf_param(v, &destname, NULL);
-       }
-       break;
-      case OPT_SHOWMAPPED:
-       usage();
+      } else {
+       set_conf_param(v, &destname, NULL);
+      }
+      break;
+    case OPT_SHOWMAPPED:
+      usage();
+      return EXIT_FAILURE;
+    case OPT_CHILDREN:
+      set_conf_param(v, &imgname, NULL);
+      break;
+    case OPT_LOCK_ADD:
+      if (args.size() < 2) {
+       cerr << "error: not enough arguments to lock add" << std::endl;
        return EXIT_FAILURE;
-      case OPT_CHILDREN:
-       set_conf_param(v, &imgname, NULL);
-       break;
-      case OPT_LOCK_ADD:
-       if (args.size() < 2) {
-         cerr << "error: not enough arguments to lock add" << std::endl;
-         return EXIT_FAILURE;
-       }
-       set_conf_param(v, &imgname, NULL);
-       v = *(++i);
-       set_conf_param(v, &lock_cookie, NULL);
-       break;
-      case OPT_LOCK_REMOVE:
-       if (args.size() < 3) {
-         cerr << "error: not enough arguments to lock remove" << std::endl;
-         return EXIT_FAILURE;
-       }
-       set_conf_param(v, &imgname, NULL);
-       v = *(++i);
-       set_conf_param(v, &lock_client, NULL);
-       v = *(++i);
-       set_conf_param(v, &lock_cookie, NULL);
-       break;
+      }
+      set_conf_param(v, &imgname, NULL);
+      v = *(++i);
+      set_conf_param(v, &lock_cookie, NULL);
+      break;
+    case OPT_LOCK_REMOVE:
+      if (args.size() < 3) {
+       cerr << "error: not enough arguments to lock remove" << std::endl;
+       return EXIT_FAILURE;
+      }
+      set_conf_param(v, &imgname, NULL);
+      v = *(++i);
+      set_conf_param(v, &lock_client, NULL);
+      v = *(++i);
+      set_conf_param(v, &lock_cookie, NULL);
+      break;
     default:
-       assert(0);
-       break;
+      assert(0);
+      break;
+  }
+  if (i != args.end()) {
+    cerr << "rbd: extra arguments given: ";
+    while (i < args.end()) {
+      cerr << *i << " ";
+      i++;
     }
+    cerr << std::endl;
+    return EXIT_FAILURE;
   }
 
   if (format_specified && opt_cmd != OPT_IMPORT && opt_cmd != OPT_CREATE) {