]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: decrypt multipart get part when encrypted 60019/head
authorsungjoon-koh <sungjoon_koh@linecorp.com>
Fri, 27 Sep 2024 07:31:26 +0000 (16:31 +0900)
committersungjoon-koh <sungjoon_koh@linecorp.com>
Tue, 1 Oct 2024 01:51:22 +0000 (10:51 +0900)
Copy crypt related attrs for get object with partNumber

Signed-off-by: sungjoon-koh <sungjoon_koh@linecorp.com>
src/rgw/driver/rados/rgw_rados.cc

index 99751be392f6cfe105bae3933f3964f0b2d046be..1ca40050d7bbf16dd39edba9ff41f59858c3e1be 100644 (file)
@@ -6809,6 +6809,13 @@ int RGWRados::Object::Read::prepare(optional_yield y, const DoutPrefixProvider *
   RGWBucketInfo& bucket_info = source->get_bucket_info();
 
   if (params.part_num) {
+    map<string, bufferlist> src_attrset;
+    for (auto& iter : astate->attrset) {
+      if (boost::algorithm::starts_with(iter.first, RGW_ATTR_CRYPT_PREFIX)) {
+        ldpp_dout(dpp, 4) << "get src crypt attr: " << iter.first << dendl;
+        src_attrset[iter.first] = iter.second;
+      }
+    }
     int parts_count = 0;
     // use the manifest to redirect to the requested part number
     r = get_part_obj_state(dpp, y, store, bucket_info, &source->get_ctx(),
@@ -6831,6 +6838,13 @@ int RGWRados::Object::Read::prepare(optional_yield y, const DoutPrefixProvider *
     } else {
       params.parts_count = parts_count;
     }
+
+    for (auto& iter : src_attrset) {
+      ldpp_dout(dpp, 4) << "copy crypt attr: " << iter.first << dendl;
+      if (astate->attrset.find(iter.first) == astate->attrset.end()) {
+        astate->attrset[iter.first] = std::move(iter.second);
+      }
+    }
   }
 
   state.obj = astate->obj;