| 62 | } |
| 63 | |
| 64 | inline int decrypt_aligned_extent(io::ReadExtent& extent, |
| 65 | uint64_t image_offset) { |
| 66 | if (extent.length == 0 || extent.bl.length() == 0) { |
| 67 | return 0; |
| 68 | } |
| 69 | |
| 70 | if (extent.extent_map.empty()) { |
| 71 | extent.extent_map.emplace_back(extent.offset, extent.bl.length()); |
| 72 | } |
| 73 | |
| 74 | ceph::bufferlist result_bl; |
| 75 | io::Extents result_extent_map; |
| 76 | |
| 77 | ceph::bufferlist curr_block_bl; |
| 78 | auto curr_offset = extent.offset; |
| 79 | auto curr_block_start_offset = curr_offset; |
| 80 | auto curr_block_end_offset = curr_offset; |
| 81 | |
| 82 | // this will add a final loop iteration for decrypting the last extent |
| 83 | extent.extent_map.emplace_back( |
| 84 | extent.offset + extent.length + get_block_size(), 0); |
| 85 | |
| 86 | for (auto [off, len]: extent.extent_map) { |
| 87 | auto [aligned_off, aligned_len] = align(off, len); |
| 88 | if (aligned_off > curr_block_end_offset) { |
| 89 | curr_block_bl.append_zero(curr_block_end_offset - curr_offset); |
| 90 | auto curr_block_length = curr_block_bl.length(); |
| 91 | if (curr_block_length > 0) { |
| 92 | auto r = decrypt( |
| 93 | &curr_block_bl, |
| 94 | image_offset + curr_block_start_offset - extent.offset); |
| 95 | if (r != 0) { |
| 96 | return r; |
| 97 | } |
| 98 | |
| 99 | curr_block_bl.splice(0, curr_block_length, &result_bl); |
| 100 | result_extent_map.emplace_back( |
| 101 | curr_block_start_offset, curr_block_length); |
| 102 | } |
| 103 | |
| 104 | curr_block_start_offset = aligned_off; |
| 105 | curr_block_end_offset = aligned_off + aligned_len; |
| 106 | curr_offset = aligned_off; |
| 107 | } |
| 108 | |
| 109 | curr_block_bl.append_zero(off - curr_offset); |
| 110 | extent.bl.splice(0, len, &curr_block_bl); |
| 111 | curr_offset = off + len; |
| 112 | curr_block_end_offset = aligned_off + aligned_len; |
| 113 | } |
| 114 | |
| 115 | extent.bl = std::move(result_bl); |
| 116 | extent.extent_map = std::move(result_extent_map); |
| 117 | |
| 118 | return 0; |
| 119 | } |
| 120 | }; |
| 121 |
no test coverage detected