]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fixup_range() clamps offsets to valid part range 27297/head
authorCasey Bodley <cbodley@redhat.com>
Wed, 27 Mar 2019 17:52:59 +0000 (13:52 -0400)
committerAbhishek Lekshmanan <abhishek@suse.com>
Mon, 1 Apr 2019 15:58:27 +0000 (17:58 +0200)
Signed-off-by: Adam Kupczyk <akupczyk@redhat.com>
Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit 4b3bac20d550cae274c07a1d555751483dde463b)

src/rgw/rgw_crypt.cc
src/test/rgw/test_rgw_crypto.cc

index 079f8cd312668189bf8af00a3584df5f935b38e2..5e569f212b4210964dd6de56fdbc92f9f8343e7c 100644 (file)
@@ -573,23 +573,22 @@ int RGWGetObj_BlockDecrypt::fixup_range(off_t& bl_ofs, off_t& bl_end) {
     }
     //in_ofs is inside block i
     size_t j = 0;
-    while (j<parts_len.size() && (in_end >= (off_t)parts_len[j])) {
+    while (j<(parts_len.size() - 1) && (in_end >= (off_t)parts_len[j])) {
       in_end -= parts_len[j];
       j++;
     }
-    //in_end is inside block j
+    //in_end is inside part j, OR j is the last part
 
-    size_t rounded_end;
-    rounded_end = ( in_end & ~(block_size - 1) ) + (block_size - 1);
-    if (rounded_end + 1 >= parts_len[j]) {
+    size_t rounded_end = ( in_end & ~(block_size - 1) ) + (block_size - 1);
+    if (rounded_end > parts_len[j]) {
       rounded_end = parts_len[j] - 1;
     }
 
     enc_begin_skip = in_ofs & (block_size - 1);
     ofs = bl_ofs - enc_begin_skip;
     end = bl_end;
-    bl_ofs = bl_ofs - enc_begin_skip;
     bl_end += rounded_end - in_end;
+    bl_ofs = std::min(bl_ofs - enc_begin_skip, bl_end);
   }
   else
   {
index 7253771a9d326a6132ed065e383963e129879752..ed8f4a6c5ca065f668a444cf97388c21ebe5866c 100644 (file)
@@ -687,11 +687,11 @@ TEST(TestRGWCrypto, check_RGWGetObj_BlockDecrypt_fixup_invalid_ranges)
   // would've returned a 411 before reaching, but we're just doing this to make
   // sure we don't have invalid access
   ASSERT_EQ(fixup_range(&decrypt, obj_size - 1, obj_size + 100),
-           range_t(obj_size - 4096, obj_size + 4095));
+            range_t(obj_size - 4096, obj_size - 1));
   ASSERT_EQ(fixup_range(&decrypt, obj_size, obj_size + 1),
-           range_t(obj_size, obj_size + 4095));
+            range_t(obj_size - 1, obj_size - 1));
   ASSERT_EQ(fixup_range(&decrypt, obj_size+1, obj_size + 100),
-           range_t(obj_size, obj_size + 4095));
+            range_t(obj_size - 1, obj_size - 1));
 
 }