]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: fix validatation of mds ids in mon commands
authorSage Weil <sage@inktank.com>
Sat, 11 May 2013 05:14:05 +0000 (22:14 -0700)
committerSage Weil <sage@inktank.com>
Tue, 14 May 2013 16:19:08 +0000 (09:19 -0700)
Fixes: #4996
Signed-off-by: Sage Weil <sage@inktank.com>
(cherry picked from commit 5c305d63043762027323052b4bb3ae3063665c6f)

Conflicts:

src/mon/MDSMonitor.cc

src/mon/MDSMonitor.cc
src/mon/MDSMonitor.h

index be6738a03238b774c5554304554dac8ab016bd35..bd6d1c66fc797f459a16009b9aaabfa526e4e3ec 100644 (file)
@@ -508,6 +508,27 @@ void MDSMonitor::dump_info(Formatter *f)
   f->close_section();
 }
 
+int MDSMonitor::parse_mds_id(const char *s, stringstream *pss)
+{
+  // osd.NNN?
+  if (strncmp(s, "mds.", 4) == 0) {
+    s += 4;
+  }
+
+  // NNN?
+  ostringstream ss;
+  long id = parse_pos_long(s, &ss);
+  if (id < 0) {
+    *pss << ss.str();
+    return id;
+  }
+  if (id > 0xffff) {
+    *pss << "mds id " << id << " is too large";
+    return -ERANGE;
+  }
+  return id;
+}
+
 bool MDSMonitor::preprocess_command(MMonCommand *m)
 {
   int r = -1;
@@ -633,18 +654,22 @@ bool MDSMonitor::preprocess_command(MMonCommand *m)
        }
       } else {
        errno = 0;
-       int who = strtol(m->cmd[0].c_str(), 0, 10);
-       m->cmd.erase(m->cmd.begin()); //done with target num now
-       if (!errno && who >= 0) {
-         if (mdsmap.is_up(who)) {
-           mon->send_command(mdsmap.get_inst(who), m->cmd, paxos->get_version());
-           r = 0;
-           ss << "ok";
-         } else {
-           ss << "mds." << who << " no up";
-           r = -ENOENT;
+       int who = parse_mds_id(m->cmd[0].c_str(), &ss);
+       if (who < 0) {
+         r = -EINVAL;
+       } else {
+         m->cmd.erase(m->cmd.begin()); //done with target num now
+         if (!errno && who >= 0) {
+           if (mdsmap.is_up(who)) {
+             mon->send_command(mdsmap.get_inst(who), m->cmd, paxos->get_version());
+             r = 0;
+             ss << "ok";
+           } else {
+             ss << "mds." << who << " no up";
+             r = -ENOENT;
+           }
          }
-       } else ss << "specify mds number or *";
+       }
       }
     }
     else if (m->cmd[1] == "compat") {
@@ -675,9 +700,9 @@ bool MDSMonitor::preprocess_command(MMonCommand *m)
 
 int MDSMonitor::fail_mds(std::ostream &ss, const std::string &arg)
 {
-  std::string err;
-  int w = strict_strtol(arg.c_str(), 10, &err);
-  if (!err.empty()) {
+  stringstream ss2;
+  int w = parse_mds_id(arg.c_str(), &ss2);
+  if (w < 0) {
     // Try to interpret the arg as an MDS name
     const MDSMap::mds_info_t *mds_info = mdsmap.find_by_name(arg);
     if (!mds_info) {
index d852785fa909ff905a6d30a6ebf0ff51874e125f..4f6ef2d7175f48eb5a989070857f702c47a04340 100644 (file)
@@ -69,6 +69,7 @@ class MDSMonitor : public PaxosService {
 
   void create_new_fs(MDSMap &m, int metadata_pool, int data_pool);
 
+  int parse_mds_id(const char *s, stringstream *pss);
 
   // service methods
   void create_initial();