]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/onode-staged-tree: encode/decode stage_size instead
authorYingxin Cheng <yingxin.cheng@intel.com>
Tue, 8 Jun 2021 01:59:32 +0000 (09:59 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Fri, 11 Jun 2021 14:59:18 +0000 (22:59 +0800)
end-offset may risk overflow the node_offset_t, but stage_size will not.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/onode_manager/staged-fltree/stages/item_iterator_stage.h
src/crimson/os/seastore/onode_manager/staged-fltree/stages/sub_items_stage.h

index 248ed606537aa125838cb5ab824512a515619d90..3cc70752b418186c05c9381b347700c7f0e97a71 100644 (file)
@@ -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<node_offset_t>(start_offset), encoded);
-    ceph::encode(static_cast<node_offset_t>(end_offset), encoded);
+    ceph::encode(static_cast<node_offset_t>(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;
index 1e01c033185fbb3433ef8491980ce917afb0044a..b82d187946bb79c7750c34f93b897ccca3ca315b 100644 (file)
@@ -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<node_offset_t>(start_offset), encoded);
-    ceph::encode(static_cast<node_offset_t>(end_offset), encoded);
+    ceph::encode(static_cast<node_offset_t>(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<const char*>(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<node_offset_t>(start_offset), encoded);
-    ceph::encode(static_cast<node_offset_t>(end_offset), encoded);
+    ceph::encode(static_cast<node_offset_t>(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});
   }