]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fixup_range() clamps offsets to valid part range 27295/head
authorCasey Bodley <cbodley@redhat.com>
Wed, 27 Mar 2019 17:52:59 +0000 (13:52 -0400)
committerAbhishek Lekshmanan <abhishek@suse.com>
Tue, 2 Apr 2019 07:46:55 +0000 (09:46 +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 10c9693e1f6eb3796ffca366de4946b69f83fc88..cf4e38995eb9c5989d3f3363fb81764a9678d693 100644 (file)
@@ -673,23 +673,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 e12b423e96acf29ee7877101c5317dad93631d26..522c8bb27572221ebae1193d6abebfc418fccf59 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));
 
 }