]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix crypto handling of empty reads
authorOr Ozeri <oro@il.ibm.com>
Thu, 24 Dec 2020 09:24:40 +0000 (11:24 +0200)
committerOr Ozeri <oro@il.ibm.com>
Thu, 24 Dec 2020 09:43:11 +0000 (11:43 +0200)
This commit ensures correct handling of empty bufferlists returned by librados object read

Signed-off-by: Or Ozeri <oro@il.ibm.com>
src/librbd/crypto/CryptoInterface.h
src/librbd/crypto/CryptoObjectDispatch.cc

index 29e205188fe8928ce80deb38d9fa12b1cbd305fa..8b1f57924b1f2fff53845b593a3569528f69a384 100644 (file)
@@ -60,7 +60,7 @@ public:
 
   inline int decrypt_aligned_extent(io::ReadExtent& extent,
                                     uint64_t image_offset) {
-    if (extent.length == 0) {
+    if (extent.length == 0 || extent.bl.length() == 0) {
       return 0;
     }
 
index b82cd679f7649dda19b54b0fa0e83c3d5f4e5ef2..2c5f9b37019b1ae7bacd0121600cd05734f73bf7 100644 (file)
@@ -132,8 +132,13 @@ struct C_UnalignedObjectReadRequest : public Context {
         auto& extent = (*extents)[i];
         auto& aligned_extent = aligned_extents[i];
         if (aligned_extent.extent_map.empty()) {
-          aligned_extent.bl.splice(extent.offset - aligned_extent.offset,
-                                   extent.length, &extent.bl);
+          uint64_t cut_offset = extent.offset - aligned_extent.offset;
+          int64_t padding_count =
+                  cut_offset + extent.length - aligned_extent.bl.length();
+          if (padding_count > 0) {
+            aligned_extent.bl.append_zero(padding_count);
+          }
+          aligned_extent.bl.splice(cut_offset, extent.length, &extent.bl);
         } else {
           for (auto [off, len]: aligned_extent.extent_map) {
             ceph::bufferlist tmp;