]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: image-extent cache needs to clip out-of-bounds read buffers 13679/head
authorJason Dillaman <dillaman@redhat.com>
Tue, 28 Feb 2017 01:24:48 +0000 (20:24 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 28 Feb 2017 01:24:48 +0000 (20:24 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/io/ImageRequest.cc
src/librbd/io/ImageRequest.h

index e2b873d067318f15fdc11de515e63db0de069789..4ad28fe4cbd2f90d608d536fc04cf52824a319a7 100644 (file)
@@ -203,6 +203,22 @@ ImageReadRequest<I>::ImageReadRequest(I &image_ctx, AioCompletion *aio_comp,
   aio_comp->read_result = std::move(read_result);
 }
 
+template <typename I>
+int ImageReadRequest<I>::clip_request() {
+  int r = ImageRequest<I>::clip_request();
+  if (r < 0) {
+    return r;
+  }
+
+  uint64_t buffer_length = 0;
+  auto &image_extents = this->m_image_extents;
+  for (auto &image_extent : image_extents) {
+    buffer_length += image_extent.second;
+  }
+  this->m_aio_comp->read_result.set_clip_length(buffer_length);
+  return 0;
+}
+
 template <typename I>
 void ImageReadRequest<I>::send_request() {
   I &image_ctx = this->m_image_ctx;
@@ -236,7 +252,6 @@ void ImageReadRequest<I>::send_request() {
       buffer_ofs += extent.second;
     }
   }
-  aio_comp->read_result.set_clip_length(buffer_ofs);
 
   // pre-calculate the expected number of read requests
   uint32_t request_count = 0;
index 0bdca22e63b25a743234e7f482b643d49481e325..96629b81636ad7bb90f98b686021afd2222f0efb 100644 (file)
@@ -83,6 +83,8 @@ public:
                    int op_flags);
 
 protected:
+  int clip_request() override;
+
   void send_request() override;
   void send_image_cache_request() override;