]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: add more checks when read record_header_t
authorYingxin Cheng <yingxin.cheng@intel.com>
Tue, 16 Nov 2021 08:15:42 +0000 (16:15 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 9 Dec 2021 01:37:05 +0000 (09:37 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/extent_reader.cc

index bd95eb9dae7730ae340605a25675d8c5a3a0299c..e3c3a5a45c5cf8fe27c0564e155289de6026fb94 100644 (file)
@@ -252,8 +252,13 @@ ExtentReader::read_validate_record_metadata(
         std::nullopt);
     }
     auto& seg_addr = start.as_seg_paddr();
-    if (seg_addr.get_segment_off() + header.mdlength >
-        (int64_t)segment_manager.get_segment_size()) {
+    if (header.mdlength < block_size ||
+        header.mdlength % block_size != 0 ||
+        header.dlength % block_size != 0 ||
+        (header.committed_to != journal_seq_t() &&
+         header.committed_to.offset.as_seg_paddr().get_segment_off() % block_size != 0) ||
+        (seg_addr.get_segment_off() + header.mdlength + header.dlength >
+         (int64_t)segment_manager.get_segment_size())) {
       logger().error("read_validate_record_metadata: failed, invalid header");
       return crimson::ct_error::input_output_error::make();
     }