summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-05-10 22:14:05 -0700
committerSage Weil <sage@inktank.com>2013-05-14 09:19:08 -0700
commite0de00897468a434e94790a86fc812b77a59614c (patch)
treec4d7ef29b885af857a7a0ee467bc057f3d4378a2
parent95a0bda7f007a33b0dc7adf4b330778fa1e5d70c (diff)
downloadceph-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.cc53
-rw-r--r--src/mon/MDSMonitor.h1
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();