From: Sage Weil Date: Thu, 2 Aug 2018 19:34:44 +0000 (-0500) Subject: mon: catch bad_cmd_exception and reply EINVAL X-Git-Tag: v12.2.11~71^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a0f25a93d0eb4de1877e84029ac37ce015708ba9;p=ceph.git mon: catch bad_cmd_exception and reply EINVAL If we get bad input we should always reply EINVAL. Note that bad_cmd_get will be reserved for invalid input, not missing/optional input, like passing a float when an int is expected. Signed-off-by: Sage Weil (cherry picked from commit b684f02c72f24c7181a459c9034ef63609060124) Conflicts: src/mon/ConfigMonitor.cc (no such file in Luminous) --- diff --git a/src/mon/AuthMonitor.cc b/src/mon/AuthMonitor.cc index 965958b1220..84832291b53 100644 --- a/src/mon/AuthMonitor.cc +++ b/src/mon/AuthMonitor.cc @@ -286,7 +286,14 @@ bool AuthMonitor::preprocess_query(MonOpRequestRef op) dout(10) << "preprocess_query " << *m << " from " << m->get_orig_source_inst() << dendl; switch (m->get_type()) { case MSG_MON_COMMAND: - return preprocess_command(op); + try { + return preprocess_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } case CEPH_MSG_AUTH: return prep_auth(op, false); @@ -306,7 +313,14 @@ bool AuthMonitor::prepare_update(MonOpRequestRef op) dout(10) << "prepare_update " << *m << " from " << m->get_orig_source_inst() << dendl; switch (m->get_type()) { case MSG_MON_COMMAND: - return prepare_command(op); + try { + return prepare_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } case MSG_MON_GLOBAL_ID: return prepare_global_id(op); case CEPH_MSG_AUTH: diff --git a/src/mon/LogMonitor.cc b/src/mon/LogMonitor.cc index 4987e67da5e..5cdf90f9e4f 100644 --- a/src/mon/LogMonitor.cc +++ b/src/mon/LogMonitor.cc @@ -256,7 +256,14 @@ bool LogMonitor::preprocess_query(MonOpRequestRef op) dout(10) << "preprocess_query " << *m << " from " << m->get_orig_source_inst() << dendl; switch (m->get_type()) { case MSG_MON_COMMAND: - return preprocess_command(op); + try { + return preprocess_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } case MSG_LOG: return preprocess_log(op); @@ -274,7 +281,14 @@ bool LogMonitor::prepare_update(MonOpRequestRef op) dout(10) << "prepare_update " << *m << " from " << m->get_orig_source_inst() << dendl; switch (m->get_type()) { case MSG_MON_COMMAND: - return prepare_command(op); + try { + return prepare_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } case MSG_LOG: return prepare_log(op); default: diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 3b10dbfc921..005894360aa 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -309,7 +309,14 @@ bool MDSMonitor::preprocess_query(MonOpRequestRef op) return preprocess_beacon(op); case MSG_MON_COMMAND: - return preprocess_command(op); + try { + return preprocess_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } case MSG_MDS_OFFLOAD_TARGETS: return preprocess_offload_targets(op); @@ -519,7 +526,14 @@ bool MDSMonitor::prepare_update(MonOpRequestRef op) return prepare_beacon(op); case MSG_MON_COMMAND: - return prepare_command(op); + try { + return prepare_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } case MSG_MDS_OFFLOAD_TARGETS: return prepare_offload_targets(op); diff --git a/src/mon/MgrMonitor.cc b/src/mon/MgrMonitor.cc index fe5bf828ac6..d9d5bd65e70 100644 --- a/src/mon/MgrMonitor.cc +++ b/src/mon/MgrMonitor.cc @@ -231,7 +231,15 @@ bool MgrMonitor::preprocess_query(MonOpRequestRef op) case MSG_MGR_BEACON: return preprocess_beacon(op); case MSG_MON_COMMAND: - return preprocess_command(op); + try { + return preprocess_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } + default: mon->no_reply(op); derr << "Unhandled message type " << m->get_type() << dendl; @@ -247,7 +255,14 @@ bool MgrMonitor::prepare_update(MonOpRequestRef op) return prepare_beacon(op); case MSG_MON_COMMAND: - return prepare_command(op); + try { + return prepare_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } default: mon->no_reply(op); diff --git a/src/mon/MonmapMonitor.cc b/src/mon/MonmapMonitor.cc index 8abcf81312e..dd66c0d6044 100644 --- a/src/mon/MonmapMonitor.cc +++ b/src/mon/MonmapMonitor.cc @@ -201,7 +201,14 @@ bool MonmapMonitor::preprocess_query(MonOpRequestRef op) switch (m->get_type()) { // READs case MSG_MON_COMMAND: - return preprocess_command(op); + try { + return preprocess_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } case MSG_MON_JOIN: return preprocess_join(op); default: @@ -403,7 +410,14 @@ bool MonmapMonitor::prepare_update(MonOpRequestRef op) switch (m->get_type()) { case MSG_MON_COMMAND: - return prepare_command(op); + try { + return prepare_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } case MSG_MON_JOIN: return prepare_join(op); default: diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 53c3769654d..aee5c8806c5 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1723,7 +1723,14 @@ bool OSDMonitor::preprocess_query(MonOpRequestRef op) switch (m->get_type()) { // READs case MSG_MON_COMMAND: - return preprocess_command(op); + try { + return preprocess_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } case CEPH_MSG_MON_GET_OSDMAP: return preprocess_get_osdmap(op); @@ -1783,7 +1790,14 @@ bool OSDMonitor::prepare_update(MonOpRequestRef op) return prepare_beacon(op); case MSG_MON_COMMAND: - return prepare_command(op); + try { + return prepare_command(op); + } + catch (const bad_cmd_get& e) { + bufferlist bl; + mon->reply_command(op, -EINVAL, e.what(), bl, get_last_committed()); + return true; + } case CEPH_MSG_POOLOP: return prepare_pool_op(op);