]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: fix validatation of mds ids in mon commands 280/head
authorSage Weil <sage@inktank.com>
Sat, 11 May 2013 05:14:05 +0000 (22:14 -0700)
committerSage Weil <sage@inktank.com>
Mon, 13 May 2013 18:49:27 +0000 (11:49 -0700)
Fixes: #4996
Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/MDSMonitor.cc
src/mon/MDSMonitor.h

index 566bf1caa3f72184cdd01640db8c151a20ff1375..43747612ddeef67f55675ac543431c68d05d8f89 100644 (file)
@@ -527,6 +527,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;
@@ -656,18 +677,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, 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, 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") {
@@ -717,9 +742,9 @@ void MDSMonitor::fail_mds_gid(uint64_t gid)
 
 int MDSMonitor::fail_mds(std::ostream &ss, const std::string &arg)
 {
-  std::string err;
-  int w = strict_strtoll(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) {
@@ -731,7 +756,7 @@ int MDSMonitor::fail_mds(std::ostream &ss, const std::string &arg)
 
   if (!mon->osdmon()->is_writeable()) {
     return -EAGAIN;
- }
 }
 
   bool failed_mds_gid = false;
   if (pending_mdsmap.up.count(w)) {
index 52841cfff1060722909f3709ee7c8ac96d62ccea..674003728aa2830dfe6a173080a966aabfc57b5c 100644 (file)
@@ -65,6 +65,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();