]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson: check -ENAMETOOLONG for Name, Locator, NameSpace 45822/head
authorchunmei-liu <chunmei.liu@intel.com>
Fri, 8 Apr 2022 07:07:53 +0000 (00:07 -0700)
committerchunmei-liu <chunmei.liu@intel.com>
Sat, 9 Apr 2022 01:01:23 +0000 (18:01 -0700)
Signed-off-by: chunmei-liu <chunmei.liu@intel.com>
src/crimson/osd/osd_operations/client_request.cc
src/crimson/osd/osd_operations/client_request.h

index 66cd414ffc81a76ebc2438246f4c109622415627..3328ae4267124440230dfcea82a4c6f8389703d8 100644 (file)
@@ -210,6 +210,20 @@ ClientRequest::process_op(Ref<PG> &pg)
   }));
 }
 
+auto ClientRequest::reply_op_error(Ref<PG>& pg, int err)
+{
+  auto reply = crimson::make_message<MOSDOpReply>(
+    m.get(), err, pg->get_osdmap_epoch(),
+    m->get_flags() & (CEPH_OSD_FLAG_ACK|CEPH_OSD_FLAG_ONDISK),
+    !m->has_flag(CEPH_OSD_FLAG_RETURNVEC));
+  reply->set_reply_versions(eversion_t(), 0);
+  reply->set_op_returns(std::vector<pg_log_op_return_item_t>{});
+  return conn->send(std::move(reply)).then([] {
+    return seastar::make_ready_future<ClientRequest::seq_mode_t>
+      (seq_mode_t::OUT_OF_ORDER);
+  });
+}
+
 ClientRequest::interruptible_future<ClientRequest::seq_mode_t>
 ClientRequest::do_process(Ref<PG>& pg, crimson::osd::ObjectContextRef obc)
 {
@@ -220,15 +234,23 @@ ClientRequest::do_process(Ref<PG>& pg, crimson::osd::ObjectContextRef obc)
       return seastar::make_ready_future<seq_mode_t>(seq_mode_t::OUT_OF_ORDER);
     } else if (const hobject_t& hoid = m->get_hobj();
                !pg->get_peering_state().can_serve_replica_read(hoid)) {
-      auto reply = crimson::make_message<MOSDOpReply>(
-       m.get(), -EAGAIN, pg->get_osdmap_epoch(),
-       m->get_flags() & (CEPH_OSD_FLAG_ACK|CEPH_OSD_FLAG_ONDISK),
-       !m->has_flag(CEPH_OSD_FLAG_RETURNVEC));
-      return conn->send(std::move(reply)).then([] {
-        return seastar::make_ready_future<seq_mode_t>(seq_mode_t::OUT_OF_ORDER);
-      });
+      return reply_op_error(pg, -EAGAIN);
     }
   }
+
+  if (m->get_oid().name.size()
+    > crimson::common::local_conf()->osd_max_object_name_len) {
+    return reply_op_error(pg, -ENAMETOOLONG);
+  } else if (m->get_hobj().get_key().size()
+    > crimson::common::local_conf()->osd_max_object_name_len) {
+    return reply_op_error(pg, -ENAMETOOLONG);
+  } else if (m->get_hobj().nspace.size()
+    > crimson::common::local_conf()->osd_max_object_namespace_len) {
+    return reply_op_error(pg, -ENAMETOOLONG);
+  } else if (m->get_hobj().oid.name.empty()) {
+    return reply_op_error(pg, -EINVAL);
+  }
+
   return pg->do_osd_ops(m, obc, op_info).safe_then_unpack_interruptible(
     [this, pg](auto submitted, auto all_completed) mutable {
     return submitted.then_interruptible(
index d695e2c3ee9d2fba8fa633ff20998d547b39840b..db99fd85e9f4ca792a056f6241eed3761136770d 100644 (file)
@@ -62,6 +62,7 @@ public:
 private:
   template <typename FuncT>
   interruptible_future<> with_sequencer(FuncT&& func);
+  auto reply_op_error(Ref<PG>& pg, int err);
 
   enum class seq_mode_t {
     IN_ORDER,