From e11c1773961cdcadfc3bcb07e5400a58a961538a Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Tue, 8 Jun 2021 09:59:32 +0800 Subject: [PATCH] crimson/onode-staged-tree: encode/decode stage_size instead end-offset may risk overflow the node_offset_t, but stage_size will not. Signed-off-by: Yingxin Cheng --- .../stages/item_iterator_stage.h | 20 +++++---- .../staged-fltree/stages/sub_items_stage.h | 42 ++++++++++--------- 2 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/item_iterator_stage.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/item_iterator_stage.h index 248ed606537aa..3cc70752b4181 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/item_iterator_stage.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/item_iterator_stage.h @@ -92,11 +92,12 @@ class item_iterator_t { } void encode(const char* p_node_start, ceph::bufferlist& encoded) const { int start_offset = p_items_start - p_node_start; - int end_offset = p_items_end - p_node_start; - assert(start_offset > 0 && start_offset < (int)node_size); - assert(end_offset > 0 && end_offset <= (int)node_size); + int stage_size = p_items_end - p_items_start; + assert(start_offset > 0); + assert(stage_size > 0); + assert(start_offset + stage_size <= (int)node_size); ceph::encode(static_cast(start_offset), encoded); - ceph::encode(static_cast(end_offset), encoded); + ceph::encode(static_cast(stage_size), encoded); ceph::encode(_index, encoded); } @@ -105,15 +106,16 @@ class item_iterator_t { ceph::bufferlist::const_iterator& delta) { node_offset_t start_offset; ceph::decode(start_offset, delta); - node_offset_t end_offset; - ceph::decode(end_offset, delta); - assert(start_offset < end_offset); - assert(end_offset <= node_size); + node_offset_t stage_size; + ceph::decode(stage_size, delta); + assert(start_offset > 0); + assert(stage_size > 0); + assert((unsigned)start_offset + stage_size <= node_size); index_t index; ceph::decode(index, delta); item_iterator_t ret({{p_node_start + start_offset, - p_node_start + end_offset}, + p_node_start + start_offset + stage_size}, node_size}); while (index > 0) { ++ret; diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/sub_items_stage.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/sub_items_stage.h index 1e01c033185fb..b82d187946bb7 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/sub_items_stage.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/sub_items_stage.h @@ -77,12 +77,12 @@ class internal_sub_items_t { sizeof(internal_sub_item_t); auto p_start = p_end - num_items * sizeof(internal_sub_item_t); int start_offset = p_start - p_node_start; - int end_offset = p_end - p_node_start; - assert(start_offset > 0 && - start_offset < end_offset && - end_offset < (int)node_size); + int stage_size = p_end - p_start; + assert(start_offset > 0); + assert(stage_size > 0); + assert(start_offset + stage_size < (int)node_size); ceph::encode(static_cast(start_offset), encoded); - ceph::encode(static_cast(end_offset), encoded); + ceph::encode(static_cast(stage_size), encoded); } static internal_sub_items_t decode( @@ -91,12 +91,13 @@ class internal_sub_items_t { ceph::bufferlist::const_iterator& delta) { node_offset_t start_offset; ceph::decode(start_offset, delta); - node_offset_t end_offset; - ceph::decode(end_offset, delta); - assert(start_offset < end_offset); - assert(end_offset <= node_size); + node_offset_t stage_size; + ceph::decode(stage_size, delta); + assert(start_offset > 0); + assert(stage_size > 0); + assert((unsigned)start_offset + stage_size < node_size); return internal_sub_items_t({{p_node_start + start_offset, - p_node_start + end_offset}, + p_node_start + start_offset + stage_size}, node_size}); } @@ -251,12 +252,12 @@ class leaf_sub_items_t { auto p_end = reinterpret_cast(p_num_keys) + sizeof(num_keys_t); int start_offset = p_start() - p_node_start; - int end_offset = p_end - p_node_start; - assert(start_offset > 0 && - start_offset < end_offset && - end_offset < (int)node_size); + int stage_size = p_end - p_start(); + assert(start_offset > 0); + assert(stage_size > 0); + assert(start_offset + stage_size < (int)node_size); ceph::encode(static_cast(start_offset), encoded); - ceph::encode(static_cast(end_offset), encoded); + ceph::encode(static_cast(stage_size), encoded); } static leaf_sub_items_t decode( @@ -265,12 +266,13 @@ class leaf_sub_items_t { ceph::bufferlist::const_iterator& delta) { node_offset_t start_offset; ceph::decode(start_offset, delta); - node_offset_t end_offset; - ceph::decode(end_offset, delta); - assert(start_offset < end_offset); - assert(end_offset < node_size); + node_offset_t stage_size; + ceph::decode(stage_size, delta); + assert(start_offset > 0); + assert(stage_size > 0); + assert((unsigned)start_offset + stage_size < node_size); return leaf_sub_items_t({{p_node_start + start_offset, - p_node_start + end_offset}, + p_node_start + start_offset + stage_size}, node_size}); } -- 2.39.5