@@ -324,31 +324,33 @@ static struct aws_s3_meta_request_vtable s_s3_auto_ranged_put_vtable = {
324324};
325325
326326/**
327- * Helper to compute request body size.
328- * Basically returns either part size or if content is not equally divisible into parts, the size of the remaining last
329- * part.
327+ * Helper to initialize the request ranges and content-length
328+ * based on the request->part_number and meta_request->part_size
330329 */
331- static size_t s_compute_request_body_size (
332- const struct aws_s3_meta_request * meta_request ,
333- uint32_t part_number ,
334- uint64_t * offset_out ) {
335- AWS_PRECONDITION (meta_request );
330+ static int s_compute_request_body_size (const struct aws_s3_meta_request * meta_request , struct aws_s3_request * request ) {
331+ AWS_ERROR_PRECONDITION (meta_request );
332+ AWS_ERROR_PRECONDITION (request );
336333
337334 const struct aws_s3_auto_ranged_put * auto_ranged_put = meta_request -> impl ;
338335
339336 size_t request_body_size = meta_request -> part_size ;
340337 /* Last part--adjust size to match remaining content length. */
341- if (auto_ranged_put -> has_content_length && part_number == auto_ranged_put -> total_num_parts_from_content_length ) {
338+ if (auto_ranged_put -> has_content_length &&
339+ request -> part_number == auto_ranged_put -> total_num_parts_from_content_length ) {
342340 size_t content_remainder = (size_t )(auto_ranged_put -> content_length % (uint64_t )meta_request -> part_size );
343341
344342 if (content_remainder > 0 ) {
345343 request_body_size = content_remainder ;
346344 }
347345 }
348- /* The part_number starts at 1 */
349- * offset_out = (part_number - 1 ) * meta_request -> part_size ;
350-
351- return request_body_size ;
346+ if (aws_mul_u64_checked (request -> part_number - 1 , meta_request -> part_size , & request -> part_range_start )) {
347+ return AWS_OP_ERR ;
348+ }
349+ if (aws_add_u64_checked (request -> part_range_start , request_body_size - 1 , & request -> part_range_end )) {
350+ return AWS_OP_ERR ;
351+ }
352+ request -> content_length = request_body_size ;
353+ return AWS_OP_SUCCESS ;
352354}
353355
354356/* Allocate a new auto-ranged put meta request */
@@ -633,9 +635,7 @@ static bool s_s3_auto_ranged_put_update(
633635
634636 request -> part_number = auto_ranged_put -> threaded_update_data .next_part_number ;
635637
636- size_t request_body_size =
637- s_compute_request_body_size (meta_request , request -> part_number , & request -> part_range_start );
638- request -> part_range_end = request -> part_range_start + request_body_size - 1 ;
638+ s_compute_request_body_size (meta_request , request );
639639
640640 /* If request was previously uploaded, we prepare it to ensure checksums still match,
641641 * but ultimately it gets marked no-op and we don't send it */
@@ -793,36 +793,6 @@ static bool s_s3_auto_ranged_put_update(
793793 return work_remaining ;
794794}
795795
796- /**
797- * Helper to initialize the request ranges and content-length
798- * based on the request->part_number and meta_request->part_size
799- */
800- static int s_compute_request_body_size (const struct aws_s3_meta_request * meta_request , struct aws_s3_request * request ) {
801- AWS_ERROR_PRECONDITION (meta_request );
802- AWS_ERROR_PRECONDITION (request );
803-
804- const struct aws_s3_auto_ranged_put * auto_ranged_put = meta_request -> impl ;
805-
806- size_t request_body_size = meta_request -> part_size ;
807- /* Last part--adjust size to match remaining content length. */
808- if (auto_ranged_put -> has_content_length &&
809- request -> part_number == auto_ranged_put -> total_num_parts_from_content_length ) {
810- size_t content_remainder = (size_t )(auto_ranged_put -> content_length % (uint64_t )meta_request -> part_size );
811-
812- if (content_remainder > 0 ) {
813- request_body_size = content_remainder ;
814- }
815- }
816- if (aws_mul_u64_checked (request -> part_number - 1 , meta_request -> part_size , & request -> part_range_start )) {
817- return AWS_OP_ERR ;
818- }
819- if (aws_add_u64_checked (request -> part_range_start , request_body_size - 1 , & request -> part_range_end )) {
820- return AWS_OP_ERR ;
821- }
822- request -> content_length = request_body_size ;
823- return AWS_OP_SUCCESS ;
824- }
825-
826796static int s_verify_part_matches_checksum (
827797 struct aws_allocator * allocator ,
828798 struct aws_byte_cursor body_cur ,
0 commit comments