From: Casey Bodley Date: Wed, 27 Mar 2019 17:52:59 +0000 (-0400) Subject: rgw: fixup_range() clamps offsets to valid part range X-Git-Tag: v15.0.0~30^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=4b3bac20d550cae274c07a1d555751483dde463b;p=ceph-ci.git rgw: fixup_range() clamps offsets to valid part range Signed-off-by: Adam Kupczyk Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_crypt.cc b/src/rgw/rgw_crypt.cc index a0a225cbf48..00125a07539 100644 --- a/src/rgw/rgw_crypt.cc +++ b/src/rgw/rgw_crypt.cc @@ -575,23 +575,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= (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 { diff --git a/src/test/rgw/test_rgw_crypto.cc b/src/test/rgw/test_rgw_crypto.cc index 5f6e805f83f..1ab95592840 100644 --- a/src/test/rgw/test_rgw_crypto.cc +++ b/src/test/rgw/test_rgw_crypto.cc @@ -680,11 +680,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)); }