]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/journal: check offset against segment length in replay
authorSamuel Just <sjust@redhat.com>
Tue, 1 Sep 2020 23:08:01 +0000 (16:08 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 20 Oct 2020 19:27:08 +0000 (12:27 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/journal.cc

index d044c0abf60e03095c3c0da48eadb4320df922e8..8f98b0ab846ab3844d1196b2478a4fa6b3c45e97 100644 (file)
@@ -286,6 +286,11 @@ Journal::find_replay_segments_fut Journal::find_replay_segments()
 Journal::read_record_metadata_ret Journal::read_record_metadata(
   paddr_t start)
 {
+  if (start.offset + block_size > (int64_t)segment_manager.get_segment_size()) {
+    return read_record_metadata_ret(
+      read_record_metadata_ertr::ready_future_marker{},
+      std::nullopt);
+  }
   return segment_manager.read(start, block_size
   ).safe_then(
     [this, start](bufferptr bptr) mutable
@@ -303,6 +308,10 @@ Journal::read_record_metadata_ret Journal::read_record_metadata(
          std::nullopt);
       }
       if (header.mdlength > block_size) {
+       if (start.offset + header.mdlength >
+           (int64_t)segment_manager.get_segment_size()) {
+         return crimson::ct_error::input_output_error::make();
+       }
        return segment_manager.read(
          {start.segment, start.offset + (segment_off_t)block_size},
          header.mdlength - block_size).safe_then(