From 2a5b6a133df32347726a90741eae5282ec10c43b Mon Sep 17 00:00:00 2001 From: chunmei-liu Date: Fri, 8 Apr 2022 00:07:53 -0700 Subject: [PATCH] crimson: check -ENAMETOOLONG for Name, Locator, NameSpace Signed-off-by: chunmei-liu --- .../osd/osd_operations/client_request.cc | 36 +++++++++++++++---- .../osd/osd_operations/client_request.h | 1 + 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/crimson/osd/osd_operations/client_request.cc b/src/crimson/osd/osd_operations/client_request.cc index 66cd414ffc81a..3328ae4267124 100644 --- a/src/crimson/osd/osd_operations/client_request.cc +++ b/src/crimson/osd/osd_operations/client_request.cc @@ -210,6 +210,20 @@ ClientRequest::process_op(Ref &pg) })); } +auto ClientRequest::reply_op_error(Ref& pg, int err) +{ + auto reply = crimson::make_message( + 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{}); + return conn->send(std::move(reply)).then([] { + return seastar::make_ready_future + (seq_mode_t::OUT_OF_ORDER); + }); +} + ClientRequest::interruptible_future ClientRequest::do_process(Ref& pg, crimson::osd::ObjectContextRef obc) { @@ -220,15 +234,23 @@ ClientRequest::do_process(Ref& pg, crimson::osd::ObjectContextRef obc) return seastar::make_ready_future(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( - 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::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( diff --git a/src/crimson/osd/osd_operations/client_request.h b/src/crimson/osd/osd_operations/client_request.h index d695e2c3ee9d2..db99fd85e9f4c 100644 --- a/src/crimson/osd/osd_operations/client_request.h +++ b/src/crimson/osd/osd_operations/client_request.h @@ -62,6 +62,7 @@ public: private: template interruptible_future<> with_sequencer(FuncT&& func); + auto reply_op_error(Ref& pg, int err); enum class seq_mode_t { IN_ORDER, -- 2.39.5