]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common: catch cmd_bad_get
authorSage Weil <sage@redhat.com>
Mon, 13 Aug 2018 18:28:40 +0000 (13:28 -0500)
committerSage Weil <sage@redhat.com>
Sat, 1 Sep 2018 21:38:58 +0000 (16:38 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/common/admin_socket.cc
src/common/ceph_context.cc
src/common/cmdparse.cc

index a49298c6b403a9e97acfcee44f1dbe24b7b4f386..009304587c05d789bcbf0007d0ad4ee57cadb24e 100644 (file)
@@ -352,11 +352,16 @@ bool AdminSocket::do_accept()
     retry_sys_call(::close, connection_fd);
     return false;
   }
-  cmd_getval(m_cct, cmdmap, "format", format);
+  try {
+    cmd_getval(m_cct, cmdmap, "format", format);
+    cmd_getval(m_cct, cmdmap, "prefix", c);
+  } catch (const bad_cmd_get& e) {
+    retry_sys_call(::close, connection_fd);
+    return false;
+  }
   if (format != "json" && format != "json-pretty" &&
       format != "xml" && format != "xml-pretty")
     format = "json-pretty";
-  cmd_getval(m_cct, cmdmap, "prefix", c);
 
   std::unique_lock l(lock);
   decltype(hooks)::iterator p;
index 2e633fbed74df5435dde5e952ebc872e5514f10a..e311eae3880d1f5ae190e2ace03f8c4c13726e5c 100644 (file)
@@ -376,7 +376,11 @@ public:
 
   bool call(std::string_view command, const cmdmap_t& cmdmap,
            std::string_view format, bufferlist& out) override {
-    m_cct->do_command(command, cmdmap, format, &out);
+    try {
+      m_cct->do_command(command, cmdmap, format, &out);
+    } catch (const bad_cmd_get& e) {
+      return false;
+    }
     return true;
   }
 };
index 241aa3fa9ea0ad827a31837354abafe2e6db713d..4230fc5808cc9d3e9b2d1beb464e49e9fcffee13 100644 (file)
@@ -487,19 +487,23 @@ bool validate_arg(CephContext* cct,
                  std::ostream& os)
 {
   Value v;
-  if (!cmd_getval(cct, cmdmap, string(name), v)) {
-    if constexpr (is_vector) {
-      // an empty list is acceptable.
-      return true;
-    } else {
-      if (auto req = desc.find("req");
-         req != end(desc) && req->second == "false") {
-       return true;
-      } else {
-       os << "missing required parameter: '" << name << "'";
-       return false;
+  try {
+    if (!cmd_getval(cct, cmdmap, string(name), v)) {
+      if constexpr (is_vector) {
+         // an empty list is acceptable.
+         return true;
+       } else {
+       if (auto req = desc.find("req");
+           req != end(desc) && req->second == "false") {
+         return true;
+       } else {
+         os << "missing required parameter: '" << name << "'";
+         return false;
+       }
       }
     }
+  } catch (const bad_cmd_get& e) {
+    return false;
   }
   auto validate = [&](const T& value) {
     if constexpr (is_same_v<std::string, T>) {