diff options
author | Sage Weil <sage@inktank.com> | 2013-05-10 22:14:05 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-14 09:19:08 -0700 |
commit | e0de00897468a434e94790a86fc812b77a59614c (patch) | |
tree | c4d7ef29b885af857a7a0ee467bc057f3d4378a2 | |
parent | 95a0bda7f007a33b0dc7adf4b330778fa1e5d70c (diff) | |
download | ceph-e0de00897468a434e94790a86fc812b77a59614c.tar.gz |
mon: fix validatation of mds ids in mon commands
Fixes: #4996
Signed-off-by: Sage Weil <sage@inktank.com>
(cherry picked from commit 5c305d63043762027323052b4bb3ae3063665c6f)
Conflicts:
src/mon/MDSMonitor.cc
-rw-r--r-- | src/mon/MDSMonitor.cc | 53 | ||||
-rw-r--r-- | src/mon/MDSMonitor.h | 1 |
2 files changed, 40 insertions, 14 deletions
diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index be6738a0323..bd6d1c66fc7 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -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) { diff --git a/src/mon/MDSMonitor.h b/src/mon/MDSMonitor.h index d852785fa90..4f6ef2d7175 100644 --- a/src/mon/MDSMonitor.h +++ b/src/mon/MDSMonitor.h @@ -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(); |