From: Xuehan Xu Date: Wed, 14 Apr 2021 06:11:19 +0000 (+0800) Subject: crimson/os/seastore: limit the max size of objects' ns and oid X-Git-Tag: v17.1.0~2162^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F40664%2Fhead;p=ceph.git crimson/os/seastore: limit the max size of objects' ns and oid Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/onode_manager.h b/src/crimson/os/seastore/onode_manager.h index c8b95a4bd424..5031afd33dca 100644 --- a/src/crimson/os/seastore/onode_manager.h +++ b/src/crimson/os/seastore/onode_manager.h @@ -37,7 +37,8 @@ public: return seastar::make_ready_future(); } - using get_or_create_onode_ertr = base_ertr; + using get_or_create_onode_ertr = base_ertr::extend< + crimson::ct_error::value_too_large>; using get_or_create_onode_ret = get_or_create_onode_ertr::future< OnodeRef>; virtual get_or_create_onode_ret get_or_create_onode( @@ -46,7 +47,8 @@ public: return seastar::make_ready_future(); } - using get_or_create_onodes_ertr = base_ertr; + using get_or_create_onodes_ertr = base_ertr::extend< + crimson::ct_error::value_too_large>; using get_or_create_onodes_ret = get_or_create_onodes_ertr::future< std::vector>; virtual get_or_create_onodes_ret get_or_create_onodes( diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc index 6fd7fee5fe8e..b75f85e02eb3 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc @@ -2,6 +2,7 @@ // vim: ts=8 sw=2 smarttab #include "crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h" +#include "crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h" namespace { [[maybe_unused]] seastar::logger& logger() { @@ -41,6 +42,10 @@ FLTreeOnodeManager::get_or_create_onode_ret FLTreeOnodeManager::get_or_create_onode( Transaction &trans, const ghobject_t &hoid) { + if (hoid.hobj.oid.name.length() + hoid.hobj.nspace.length() + > key_view_t::MAX_NS_OID_LENGTH) { + return crimson::ct_error::value_too_large::make(); + } return tree.insert( trans, hoid, OnodeTree::tree_value_config_t{sizeof(onode_layout_t)} diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h index ff3cc305e494..d5513cdce689 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h @@ -9,6 +9,7 @@ #include #include "common/hobject.h" +#include "crimson/os/seastore/onode.h" #include "crimson/os/seastore/onode_manager/staged-fltree/fwd.h" namespace crimson::os::seastore::onode { @@ -555,6 +556,13 @@ inline std::ostream& operator<<(std::ostream& os, const key_hobj_t& key) { */ class key_view_t { public: + //FIXME: the length of ns and oid should be defined by osd_max_object_name_len + // and object_max_object_namespace_len in the future + static constexpr int MAX_NS_OID_LENGTH = + (4096 - sizeof(onode_layout_t) * 2) / 4 + - sizeof(shard_pool_t) - sizeof(crush_t) - sizeof(snap_gen_t) + - 8; // size of length field of oid and ns + /** * common interfaces as a full_key_t */