}));
}
+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)
{
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(