@@ -6811,6 +6811,8 @@ void RGWCompleteMultipart::execute(optional_yield y)
68116811 if (upload->cksum_type != rgw::cksum::Type::none) {
68126812 op_ret = try_sum_part_cksums (this , s->cct , upload.get (), parts, cksum, y);
68136813 if (op_ret < 0 ) {
6814+ ldpp_dout (this , 16 ) << " ERROR: try_sum_part_cksums failed, obj="
6815+ << meta_obj << " ret=" << op_ret << dendl;
68146816 return ;
68156817 }
68166818 }
@@ -6835,13 +6837,23 @@ void RGWCompleteMultipart::execute(optional_yield y)
68356837 rgw::putobj::find_hdr_cksum (*(s->info .env ));
68366838
68376839 ldpp_dout_fmt (this , 10 ,
6838- " INFO: client supplied checksum {}: {}" ,
6840+ " INFO: client supplied checksum {}: {} " ,
68396841 hdr_cksum.header_name (), supplied_cksum);
68406842
68416843 if (! (supplied_cksum.empty ()) &&
68426844 (supplied_cksum != armored_cksum)) {
6843- op_ret = -ERR_INVALID_REQUEST;
6844- return ;
6845+ /* some minio SDK clients assert a checksum that is cryptographically
6846+ * valid but omits the part count */
6847+ auto parts_suffix = fmt::format (" -{}" , parts->parts .size ());
6848+ auto suffix_len = armored_cksum->size () - parts_suffix.size ();
6849+ if (armored_cksum->compare (0 , suffix_len, supplied_cksum) != 0 ) {
6850+ ldpp_dout_fmt (this , 4 ,
6851+ " {} content checksum mismatch"
6852+ " \n\t calculated={} != \n\t expected={}" ,
6853+ hdr_cksum.header_name (), armored_cksum, supplied_cksum);
6854+ op_ret = -ERR_INVALID_REQUEST;
6855+ return ;
6856+ }
68456857 }
68466858
68476859 buffer::list cksum_bl;
0 commit comments