From 40567cb402a00fae69a6cf44da1400c253989718 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Thu, 14 May 2026 11:53:52 -0700 Subject: [PATCH 01/10] fix unknown checksum handling --- include/aws/s3/private/s3_checksum_context.h | 2 ++ include/aws/s3/private/s3_util.h | 8 +++++++ source/s3_checksum_context.c | 4 +++- source/s3_checksums.c | 6 ++--- source/s3_default_meta_request.c | 2 +- source/s3_request_messages.c | 3 +-- source/s3_util.c | 9 ++++++++ tests/CMakeLists.txt | 2 ++ tests/s3_checksum_context_test.c | 24 ++++++++++++++++++++ tests/s3_util_tests.c | 17 ++++++++++++++ 10 files changed, 69 insertions(+), 8 deletions(-) diff --git a/include/aws/s3/private/s3_checksum_context.h b/include/aws/s3/private/s3_checksum_context.h index f58b66261..9cd2199fc 100644 --- a/include/aws/s3/private/s3_checksum_context.h +++ b/include/aws/s3/private/s3_checksum_context.h @@ -40,6 +40,8 @@ struct aws_s3_upload_request_checksum_context { /* Validation */ size_t encoded_checksum_size; + + bool has_review_callback; }; /** diff --git a/include/aws/s3/private/s3_util.h b/include/aws/s3/private/s3_util.h index d9bf7b8ca..ba2695700 100644 --- a/include/aws/s3/private/s3_util.h +++ b/include/aws/s3/private/s3_util.h @@ -385,6 +385,14 @@ int aws_s3_calculate_request_optimal_range_size( AWS_S3_API int aws_s3_extract_parts_from_etag(struct aws_byte_cursor etag_header_value, uint32_t *out_num_parts); +/** + * Helper to figure out if given header name is one of the checksum value headers. + * ex. returns true for x-amz-checksum-crc32 or x-amz-checksum-sha256, but false for x-amz-checksum-type. + * Note: relies on hardcoded list of non-checksum headers, which needs to be updated if s3 expands list of those. + */ +AWS_S3_API +bool aws_s3_is_checksum_value_header_name(struct aws_byte_cursor header_name); + AWS_EXTERN_C_END #endif /* AWS_S3_UTIL_H */ diff --git a/source/s3_checksum_context.c b/source/s3_checksum_context.c index 85106e261..a03f69f03 100644 --- a/source/s3_checksum_context.c +++ b/source/s3_checksum_context.c @@ -48,6 +48,7 @@ static struct aws_s3_upload_request_checksum_context *s_s3_upload_request_checks context->algorithm = checksum_config->checksum_algorithm; context->location = checksum_config->location; context->encoded_checksum_size = aws_get_digest_size_from_checksum_algorithm(context->algorithm); + context->has_review_callback = checksum_config->full_object_checksum_callback; /* Convert to base64 encoded size */ size_t encoded_size = 0; @@ -115,7 +116,8 @@ struct aws_s3_upload_request_checksum_context *aws_s3_upload_request_checksum_co } bool aws_s3_upload_request_checksum_context_should_calculate(struct aws_s3_upload_request_checksum_context *context) { - if (!context || context->algorithm == AWS_SCA_NONE) { + if (!context || context->algorithm == AWS_SCA_NONE || context->algorithm == AWS_SCA_UNKNOWN || + !context->has_review_callback) { return false; } diff --git a/source/s3_checksums.c b/source/s3_checksums.c index 7fd2fd0da..bdbbbb256 100644 --- a/source/s3_checksums.c +++ b/source/s3_checksums.c @@ -453,8 +453,6 @@ int aws_checksum_compute( } } -static const struct aws_byte_cursor s_checksum_prefix = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("x-amz-checksum-"); - static void s_byte_buf_to_upper(struct aws_byte_buf *buf) { AWS_PRECONDITION(buf); @@ -489,7 +487,7 @@ static int s_init_and_verify_checksum_config_from_headers( return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT); } - if (aws_byte_cursor_starts_with_ignore_case(&header.name, &s_checksum_prefix)) { + if (aws_s3_is_checksum_value_header_name(header.name)) { checksum_header_name = header.name; has_checksum_value_header = true; break; @@ -551,7 +549,7 @@ static int s_init_and_verify_checksum_config_from_headers( checksum_config->location = AWS_SCL_NONE; if (header_algo == AWS_SCA_UNKNOWN) { - aws_byte_cursor_advance(&checksum_header_name, s_checksum_prefix.len); + aws_byte_cursor_advance(&checksum_header_name, sizeof("x-amz-checksum-") - 1); aws_byte_buf_init_copy_from_cursor( &checksum_config->unknown_checksum_algo, checksum_config->allocator, checksum_header_name); s_byte_buf_to_upper(&checksum_config->unknown_checksum_algo); diff --git a/source/s3_default_meta_request.c b/source/s3_default_meta_request.c index fee2e1e0c..7f87a666e 100644 --- a/source/s3_default_meta_request.c +++ b/source/s3_default_meta_request.c @@ -347,7 +347,7 @@ static void s_s3_default_prepare_request_finish( struct aws_http_message *message = aws_s3_message_util_copy_http_message_no_body_all_headers( meta_request->allocator, meta_request->initial_request_message); - bool flexible_checksum = meta_request->checksum_config.location != AWS_SCL_NONE; + bool flexible_checksum = meta_request->checksum_config.checksum_algorithm != AWS_SCA_NONE; if (!flexible_checksum && meta_request->should_compute_content_md5) { /* If flexible checksum used, client MUST skip Content-MD5 header computation */ aws_s3_message_util_add_content_md5_header(meta_request->allocator, &request->request_body, message); diff --git a/source/s3_request_messages.c b/source/s3_request_messages.c index 689ec2123..4df62aef8 100644 --- a/source/s3_request_messages.c +++ b/source/s3_request_messages.c @@ -239,7 +239,6 @@ const struct aws_byte_cursor g_s3_create_session_allowed_headers[] = { const size_t g_s3_create_session_allowed_headers_count = AWS_ARRAY_SIZE(g_s3_create_session_allowed_headers); static const struct aws_byte_cursor s_x_amz_meta_prefix = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("x-amz-meta-"); -static const struct aws_byte_cursor s_x_amz_checksum_prefix = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("x-amz-checksum-"); static const struct aws_byte_cursor s_checksum_type_header = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("x-amz-checksum-type"); @@ -1234,7 +1233,7 @@ void aws_s3_message_util_copy_headers( } if (exclude_x_amz_checksum) { - if (aws_byte_cursor_starts_with_ignore_case(&header.name, &s_x_amz_checksum_prefix)) { + if (aws_s3_is_checksum_value_header_name(header.name)) { continue; } } diff --git a/source/s3_util.c b/source/s3_util.c index 14dc66fd1..526959ac3 100644 --- a/source/s3_util.c +++ b/source/s3_util.c @@ -1019,3 +1019,12 @@ int aws_s3_extract_parts_from_etag(struct aws_byte_cursor etag_header_value, uin return AWS_OP_SUCCESS; } + +static const struct aws_byte_cursor s_checksum_prefix = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("x-amz-checksum-"); + +bool aws_s3_is_checksum_value_header_name(struct aws_byte_cursor header_name) { + return aws_byte_cursor_starts_with_ignore_case(&header_name, &s_checksum_prefix) && + !aws_byte_cursor_eq_c_str_ignore_case(&header_name, "x-amz-checksum-type") && + !aws_byte_cursor_eq_c_str_ignore_case(&header_name, "x-amz-checksum-mode") && + !aws_byte_cursor_eq_c_str_ignore_case(&header_name, "x-amz-checksum-algorithm"); +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 842279c62..f89570933 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -243,6 +243,7 @@ add_net_test_case(test_s3_range_requests_less_than_a_part) add_net_test_case(test_s3_not_satisfiable_range) add_net_test_case(test_s3_invalid_start_range_greator_than_end_range) add_net_test_case(test_s3_empty_file_edge_case) +add_net_test_case(test_s3_default_put_object_checksum) add_net_test_case(test_s3_bad_endpoint) add_net_test_case(test_s3_different_endpoints) @@ -261,6 +262,7 @@ add_test_case(test_s3_calculate_client_optimal_range_size) add_test_case(test_s3_calculate_request_optimal_range_size) add_test_case(test_s3_extract_parts_from_etag) add_test_case(test_add_user_agent_header) +add_test_case(test_s3_checksum_header) add_test_case(test_get_existing_platform_info) add_test_case(test_get_nonexistent_platform_info) diff --git a/tests/s3_checksum_context_test.c b/tests/s3_checksum_context_test.c index e1ab61ee9..24b8538a5 100644 --- a/tests/s3_checksum_context_test.c +++ b/tests/s3_checksum_context_test.c @@ -49,6 +49,11 @@ static int s_test_upload_request_checksum_context_get_checksum_cursor(struct aws return AWS_OP_SUCCESS; } + +static struct aws_string *s_test_fn(struct aws_s3_meta_request *, void *) { + return NULL; +} + AWS_TEST_CASE( test_upload_request_checksum_context_get_checksum_cursor, s_test_upload_request_checksum_context_get_checksum_cursor) @@ -80,6 +85,25 @@ static int s_test_upload_request_checksum_context_error_cases(struct aws_allocat ASSERT_NULL(aws_s3_upload_request_checksum_context_acquire(NULL)); ASSERT_NULL(aws_s3_upload_request_checksum_context_release(NULL)); + /* unknown algo */ + struct aws_s3_meta_request_checksum_config_storage config2 = { + .allocator = allocator, + .checksum_algorithm = AWS_SCA_UNKNOWN, + .location = AWS_SCL_NONE, + .has_full_object_checksum = false, + }; + ASSERT_FALSE(aws_s3_upload_request_checksum_context_should_calculate(&config2)); + + /* unknown algo */ + struct aws_s3_meta_request_checksum_config_storage config2 = { + .allocator = allocator, + .checksum_algorithm = AWS_SCA_CRC32, + .location = AWS_SCL_NONE, + .has_full_object_checksum = false, + .full_object_checksum_callback = s_test_fn, + }; + ASSERT_FALSE(aws_s3_upload_request_checksum_context_should_calculate(&config2)); + return AWS_OP_SUCCESS; } AWS_TEST_CASE(test_upload_request_checksum_context_error_cases, s_test_upload_request_checksum_context_error_cases) diff --git a/tests/s3_util_tests.c b/tests/s3_util_tests.c index 23a5bf871..4986e786e 100644 --- a/tests/s3_util_tests.c +++ b/tests/s3_util_tests.c @@ -1046,3 +1046,20 @@ static int s_test_s3_extract_parts_from_etag(struct aws_allocator *allocator, vo aws_s3_library_clean_up(); return 0; } + +AWS_TEST_CASE(test_s3_checksum_header, s_test_s3_checksum_header) +static int s_test_s3_checksum_header(struct aws_allocator *allocator, void *ctx) { + (void)ctx; + aws_s3_library_init(allocator); + + ASSERT_TRUE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-crc32"))); + ASSERT_TRUE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-foo"))); + ASSERT_TRUE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-md5"))); + + ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-type"))); + ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-mode"))); + ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-algorithm "))); + + aws_s3_library_clean_up(); + return 0; +} From 274f14327b92b5d704d10f4300c46fb37ef181af Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Thu, 14 May 2026 13:06:06 -0700 Subject: [PATCH 02/10] fix test --- tests/s3_checksum_context_test.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/s3_checksum_context_test.c b/tests/s3_checksum_context_test.c index 24b8538a5..74a1598aa 100644 --- a/tests/s3_checksum_context_test.c +++ b/tests/s3_checksum_context_test.c @@ -50,7 +50,9 @@ static int s_test_upload_request_checksum_context_get_checksum_cursor(struct aws return AWS_OP_SUCCESS; } -static struct aws_string *s_test_fn(struct aws_s3_meta_request *, void *) { +static struct aws_string *s_test_fn(struct aws_s3_meta_request *req, void *user) { + (void)req; + (void)user; return NULL; } From 82798dffc66072aee436a56299b8a6325c973514 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Thu, 14 May 2026 13:12:26 -0700 Subject: [PATCH 03/10] more test fixes --- tests/CMakeLists.txt | 1 - tests/s3_checksum_context_test.c | 17 ++++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f89570933..7a2c71be2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -243,7 +243,6 @@ add_net_test_case(test_s3_range_requests_less_than_a_part) add_net_test_case(test_s3_not_satisfiable_range) add_net_test_case(test_s3_invalid_start_range_greator_than_end_range) add_net_test_case(test_s3_empty_file_edge_case) -add_net_test_case(test_s3_default_put_object_checksum) add_net_test_case(test_s3_bad_endpoint) add_net_test_case(test_s3_different_endpoints) diff --git a/tests/s3_checksum_context_test.c b/tests/s3_checksum_context_test.c index 74a1598aa..7e51544af 100644 --- a/tests/s3_checksum_context_test.c +++ b/tests/s3_checksum_context_test.c @@ -94,17 +94,28 @@ static int s_test_upload_request_checksum_context_error_cases(struct aws_allocat .location = AWS_SCL_NONE, .has_full_object_checksum = false, }; - ASSERT_FALSE(aws_s3_upload_request_checksum_context_should_calculate(&config2)); + struct aws_s3_upload_request_checksum_context *context2 = + aws_s3_upload_request_checksum_context_new(allocator, &config2); + + ASSERT_NOT_NULL(context2); + ASSERT_FALSE(aws_s3_upload_request_checksum_context_should_calculate(context2)); /* unknown algo */ - struct aws_s3_meta_request_checksum_config_storage config2 = { + struct aws_s3_meta_request_checksum_config_storage config3 = { .allocator = allocator, .checksum_algorithm = AWS_SCA_CRC32, .location = AWS_SCL_NONE, .has_full_object_checksum = false, .full_object_checksum_callback = s_test_fn, }; - ASSERT_FALSE(aws_s3_upload_request_checksum_context_should_calculate(&config2)); + struct aws_s3_upload_request_checksum_context *context3 = + aws_s3_upload_request_checksum_context_new(allocator, &config3); + + ASSERT_NOT_NULL(context3); + ASSERT_FALSE(aws_s3_upload_request_checksum_context_should_calculate(context3)); + + aws_s3_upload_request_checksum_context_release(context2); + aws_s3_upload_request_checksum_context_release(context3); return AWS_OP_SUCCESS; } From 8a513425ac8a1d976e07b57eb98add941b66e7e9 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Thu, 14 May 2026 13:21:23 -0700 Subject: [PATCH 04/10] test typo --- tests/s3_util_tests.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/s3_util_tests.c b/tests/s3_util_tests.c index 4986e786e..0d33b1703 100644 --- a/tests/s3_util_tests.c +++ b/tests/s3_util_tests.c @@ -1058,7 +1058,7 @@ static int s_test_s3_checksum_header(struct aws_allocator *allocator, void *ctx) ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-type"))); ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-mode"))); - ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-algorithm "))); + ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-algorithm"))); aws_s3_library_clean_up(); return 0; From de57a6b8fcb04e7310af2f42d74fdd4509b7d32a Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Thu, 14 May 2026 13:40:07 -0700 Subject: [PATCH 05/10] more test fixes --- tests/s3_checksum_context_test.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/s3_checksum_context_test.c b/tests/s3_checksum_context_test.c index 7e51544af..7776ed072 100644 --- a/tests/s3_checksum_context_test.c +++ b/tests/s3_checksum_context_test.c @@ -50,12 +50,6 @@ static int s_test_upload_request_checksum_context_get_checksum_cursor(struct aws return AWS_OP_SUCCESS; } -static struct aws_string *s_test_fn(struct aws_s3_meta_request *req, void *user) { - (void)req; - (void)user; - return NULL; -} - AWS_TEST_CASE( test_upload_request_checksum_context_get_checksum_cursor, s_test_upload_request_checksum_context_get_checksum_cursor) @@ -106,7 +100,6 @@ static int s_test_upload_request_checksum_context_error_cases(struct aws_allocat .checksum_algorithm = AWS_SCA_CRC32, .location = AWS_SCL_NONE, .has_full_object_checksum = false, - .full_object_checksum_callback = s_test_fn, }; struct aws_s3_upload_request_checksum_context *context3 = aws_s3_upload_request_checksum_context_new(allocator, &config3); From 2dccafb276f0c58639213936a5eb2352ebaa2424 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Thu, 14 May 2026 13:57:25 -0700 Subject: [PATCH 06/10] one more test --- source/s3_checksum_context.c | 2 +- tests/s3_checksum_context_test.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/source/s3_checksum_context.c b/source/s3_checksum_context.c index a03f69f03..2858871f9 100644 --- a/source/s3_checksum_context.c +++ b/source/s3_checksum_context.c @@ -117,7 +117,7 @@ struct aws_s3_upload_request_checksum_context *aws_s3_upload_request_checksum_co bool aws_s3_upload_request_checksum_context_should_calculate(struct aws_s3_upload_request_checksum_context *context) { if (!context || context->algorithm == AWS_SCA_NONE || context->algorithm == AWS_SCA_UNKNOWN || - !context->has_review_callback) { + (context->location == AWS_SCL_NONE && !context->has_review_callback)) { return false; } diff --git a/tests/s3_checksum_context_test.c b/tests/s3_checksum_context_test.c index 7776ed072..021d6fd0f 100644 --- a/tests/s3_checksum_context_test.c +++ b/tests/s3_checksum_context_test.c @@ -114,6 +114,12 @@ static int s_test_upload_request_checksum_context_error_cases(struct aws_allocat } AWS_TEST_CASE(test_upload_request_checksum_context_error_cases, s_test_upload_request_checksum_context_error_cases) +static struct aws_string *s_test_fn(struct aws_s3_meta_request *req, void *user) { + (void)req; + (void)user; + return NULL; +} + static int s_test_upload_request_checksum_context_different_algorithms(struct aws_allocator *allocator, void *ctx) { (void)ctx; From db79c844b7fc5b69bd4f7e2a9eb2ad8bacd1882f Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Thu, 14 May 2026 14:01:27 -0700 Subject: [PATCH 07/10] dead code --- tests/s3_checksum_context_test.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/s3_checksum_context_test.c b/tests/s3_checksum_context_test.c index 021d6fd0f..7776ed072 100644 --- a/tests/s3_checksum_context_test.c +++ b/tests/s3_checksum_context_test.c @@ -114,12 +114,6 @@ static int s_test_upload_request_checksum_context_error_cases(struct aws_allocat } AWS_TEST_CASE(test_upload_request_checksum_context_error_cases, s_test_upload_request_checksum_context_error_cases) -static struct aws_string *s_test_fn(struct aws_s3_meta_request *req, void *user) { - (void)req; - (void)user; - return NULL; -} - static int s_test_upload_request_checksum_context_different_algorithms(struct aws_allocator *allocator, void *ctx) { (void)ctx; From 7a734d9330898ac7a27dacc763451c3ceb85b0c5 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Thu, 14 May 2026 14:22:58 -0700 Subject: [PATCH 08/10] special case completeMPU --- source/s3_default_meta_request.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/source/s3_default_meta_request.c b/source/s3_default_meta_request.c index 7f87a666e..141befdd8 100644 --- a/source/s3_default_meta_request.c +++ b/source/s3_default_meta_request.c @@ -362,8 +362,15 @@ static void s_s3_default_prepare_request_finish( /* Only PUT Object and Upload part support trailing checksum, that needs the special encoding even if the body * has 0 length. */ /* Create checksum context from config if needed */ - struct aws_s3_upload_request_checksum_context *checksum_context = - aws_s3_upload_request_checksum_context_new(meta_request->allocator, &meta_request->checksum_config); + struct aws_s3_upload_request_checksum_context *checksum_context = NULL; + + /** + * Note: CompleteMPU is unique in the sence that checksum on the object level is the full object checksum for all parts and + * not checksum of the body. So avoid any additional checksum handling if default req is completeMPU. + */ + if (meta_request_default->request_type != AWS_S3_REQUEST_TYPE_COMPLETE_MULTIPART_UPLOAD) { + checksum_context = aws_s3_upload_request_checksum_context_new(meta_request->allocator, &meta_request->checksum_config); + } aws_s3_message_util_assign_body( meta_request->allocator, &request->request_body, NULL, message, checksum_context); From 08816773427f4b845dbd767f0ba6f3c886493419 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Thu, 14 May 2026 14:26:14 -0700 Subject: [PATCH 09/10] lint --- source/s3_default_meta_request.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/source/s3_default_meta_request.c b/source/s3_default_meta_request.c index 141befdd8..0b9be48a0 100644 --- a/source/s3_default_meta_request.c +++ b/source/s3_default_meta_request.c @@ -365,11 +365,13 @@ static void s_s3_default_prepare_request_finish( struct aws_s3_upload_request_checksum_context *checksum_context = NULL; /** - * Note: CompleteMPU is unique in the sence that checksum on the object level is the full object checksum for all parts and - * not checksum of the body. So avoid any additional checksum handling if default req is completeMPU. + * Note: CompleteMPU is unique in the sence that checksum on the object level is the full object checksum for + * all parts and not checksum of the body. So avoid any additional checksum handling if default req is + * completeMPU. */ if (meta_request_default->request_type != AWS_S3_REQUEST_TYPE_COMPLETE_MULTIPART_UPLOAD) { - checksum_context = aws_s3_upload_request_checksum_context_new(meta_request->allocator, &meta_request->checksum_config); + checksum_context = + aws_s3_upload_request_checksum_context_new(meta_request->allocator, &meta_request->checksum_config); } aws_s3_message_util_assign_body( From 6f63ac3a4c66056283e9001258c433539ca581a0 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Thu, 14 May 2026 15:06:52 -0700 Subject: [PATCH 10/10] fix test --- include/aws/s3/private/s3_checksum_context.h | 6 ++++-- source/s3_auto_ranged_put.c | 13 +++++++++---- source/s3_checksum_context.c | 15 +++++++++------ source/s3_default_meta_request.c | 4 ++-- tests/s3_checksum_context_test.c | 14 +++++++------- tests/s3_checksum_stream_test.c | 2 +- tests/s3_util_tests.c | 2 ++ 7 files changed, 34 insertions(+), 22 deletions(-) diff --git a/include/aws/s3/private/s3_checksum_context.h b/include/aws/s3/private/s3_checksum_context.h index 9cd2199fc..51a5ac276 100644 --- a/include/aws/s3/private/s3_checksum_context.h +++ b/include/aws/s3/private/s3_checksum_context.h @@ -56,7 +56,8 @@ struct aws_s3_upload_request_checksum_context { AWS_S3_API struct aws_s3_upload_request_checksum_context *aws_s3_upload_request_checksum_context_new( struct aws_allocator *allocator, - const struct aws_s3_meta_request_checksum_config_storage *checksum_config); + const struct aws_s3_meta_request_checksum_config_storage *checksum_config, + bool has_review_callback); /** * Create a new upload request checksum context with an existing base64 encoded checksum value. @@ -72,7 +73,8 @@ AWS_S3_API struct aws_s3_upload_request_checksum_context *aws_s3_upload_request_checksum_context_new_with_existing_base64_checksum( struct aws_allocator *allocator, const struct aws_s3_meta_request_checksum_config_storage *checksum_config, - struct aws_byte_cursor existing_base64_checksum); + struct aws_byte_cursor existing_base64_checksum, + bool has_review_callback); /** * Acquire a reference to the upload request checksum context. diff --git a/source/s3_auto_ranged_put.c b/source/s3_auto_ranged_put.c index b937f25fa..7873a423e 100644 --- a/source/s3_auto_ranged_put.c +++ b/source/s3_auto_ranged_put.c @@ -200,10 +200,15 @@ static int s_process_part_info_synced(const struct aws_s3_part_info *info, void if ((checksum_cur != NULL) && (checksum_cur->len > 0)) { /* Create checksum context with pre-calculated checksum */ part->checksum_context = aws_s3_upload_request_checksum_context_new_with_existing_base64_checksum( - auto_ranged_put->base.allocator, &auto_ranged_put->base.checksum_config, *checksum_cur); + auto_ranged_put->base.allocator, + &auto_ranged_put->base.checksum_config, + *checksum_cur, + meta_request->upload_review_callback != NULL); } else { part->checksum_context = aws_s3_upload_request_checksum_context_new( - auto_ranged_put->base.allocator, &auto_ranged_put->base.checksum_config); + auto_ranged_put->base.allocator, + &auto_ranged_put->base.checksum_config, + meta_request->upload_review_callback != NULL); } if (part->checksum_context == NULL) { aws_mem_release(meta_request->allocator, part); @@ -1072,8 +1077,8 @@ static int s_s3_new_upload_part_info_after_body( /* Add part to array-list */ struct aws_s3_mpu_part_info *part = aws_mem_calloc(meta_request->allocator, 1, sizeof(struct aws_s3_mpu_part_info)); - part->checksum_context = - aws_s3_upload_request_checksum_context_new(meta_request->allocator, &meta_request->checksum_config); + part->checksum_context = aws_s3_upload_request_checksum_context_new( + meta_request->allocator, &meta_request->checksum_config, meta_request->upload_review_callback != NULL); part->size = request->request_body.len; aws_array_list_set_at(&auto_ranged_put->synced_data.part_list, &part, request->part_number - 1); } diff --git a/source/s3_checksum_context.c b/source/s3_checksum_context.c index 2858871f9..2b2761057 100644 --- a/source/s3_checksum_context.c +++ b/source/s3_checksum_context.c @@ -25,7 +25,8 @@ static void s_aws_s3_upload_request_checksum_context_destroy(void *context) { static struct aws_s3_upload_request_checksum_context *s_s3_upload_request_checksum_context_new_base( struct aws_allocator *allocator, - const struct aws_s3_meta_request_checksum_config_storage *checksum_config) { + const struct aws_s3_meta_request_checksum_config_storage *checksum_config, + bool has_review_callback) { AWS_PRECONDITION(allocator); struct aws_s3_upload_request_checksum_context *context = @@ -48,7 +49,7 @@ static struct aws_s3_upload_request_checksum_context *s_s3_upload_request_checks context->algorithm = checksum_config->checksum_algorithm; context->location = checksum_config->location; context->encoded_checksum_size = aws_get_digest_size_from_checksum_algorithm(context->algorithm); - context->has_review_callback = checksum_config->full_object_checksum_callback; + context->has_review_callback = has_review_callback; /* Convert to base64 encoded size */ size_t encoded_size = 0; @@ -63,9 +64,10 @@ static struct aws_s3_upload_request_checksum_context *s_s3_upload_request_checks struct aws_s3_upload_request_checksum_context *aws_s3_upload_request_checksum_context_new( struct aws_allocator *allocator, - const struct aws_s3_meta_request_checksum_config_storage *checksum_config) { + const struct aws_s3_meta_request_checksum_config_storage *checksum_config, + bool has_review_callback) { struct aws_s3_upload_request_checksum_context *context = - s_s3_upload_request_checksum_context_new_base(allocator, checksum_config); + s_s3_upload_request_checksum_context_new_base(allocator, checksum_config, has_review_callback); if (context && context->encoded_checksum_size > 0) { /* Initial the buffer for checksum */ aws_byte_buf_init(&context->synced_data.base64_checksum, allocator, context->encoded_checksum_size); @@ -76,9 +78,10 @@ struct aws_s3_upload_request_checksum_context *aws_s3_upload_request_checksum_co struct aws_s3_upload_request_checksum_context *aws_s3_upload_request_checksum_context_new_with_existing_base64_checksum( struct aws_allocator *allocator, const struct aws_s3_meta_request_checksum_config_storage *checksum_config, - struct aws_byte_cursor existing_base64_checksum) { + struct aws_byte_cursor existing_base64_checksum, + bool has_review_callback) { struct aws_s3_upload_request_checksum_context *context = - s_s3_upload_request_checksum_context_new_base(allocator, checksum_config); + s_s3_upload_request_checksum_context_new_base(allocator, checksum_config, has_review_callback); if (context) { /* Initial the buffer for checksum from the exist checksum */ if (context->encoded_checksum_size != existing_base64_checksum.len) { diff --git a/source/s3_default_meta_request.c b/source/s3_default_meta_request.c index 0b9be48a0..7953b577b 100644 --- a/source/s3_default_meta_request.c +++ b/source/s3_default_meta_request.c @@ -370,8 +370,8 @@ static void s_s3_default_prepare_request_finish( * completeMPU. */ if (meta_request_default->request_type != AWS_S3_REQUEST_TYPE_COMPLETE_MULTIPART_UPLOAD) { - checksum_context = - aws_s3_upload_request_checksum_context_new(meta_request->allocator, &meta_request->checksum_config); + checksum_context = aws_s3_upload_request_checksum_context_new( + meta_request->allocator, &meta_request->checksum_config, meta_request->upload_review_callback != NULL); } aws_s3_message_util_assign_body( diff --git a/tests/s3_checksum_context_test.c b/tests/s3_checksum_context_test.c index 7776ed072..b6f404ff2 100644 --- a/tests/s3_checksum_context_test.c +++ b/tests/s3_checksum_context_test.c @@ -21,7 +21,7 @@ static int s_test_upload_request_checksum_context_get_checksum_cursor(struct aws /* Test get checksum cursor with context that has no calculated checksum */ struct aws_s3_upload_request_checksum_context *context = - aws_s3_upload_request_checksum_context_new(allocator, &config); + aws_s3_upload_request_checksum_context_new(allocator, &config, false); ASSERT_NOT_NULL(context); struct aws_byte_cursor cursor = aws_s3_upload_request_checksum_context_get_checksum_cursor(context); @@ -32,8 +32,8 @@ static int s_test_upload_request_checksum_context_get_checksum_cursor(struct aws /* Test get checksum cursor with context that has calculated checksum */ struct aws_byte_cursor existing_checksum = aws_byte_cursor_from_c_str("dGVzdA=="); - context = - aws_s3_upload_request_checksum_context_new_with_existing_base64_checksum(allocator, &config, existing_checksum); + context = aws_s3_upload_request_checksum_context_new_with_existing_base64_checksum( + allocator, &config, existing_checksum, false); ASSERT_NOT_NULL(context); cursor = aws_s3_upload_request_checksum_context_get_checksum_cursor(context); @@ -69,7 +69,7 @@ static int s_test_upload_request_checksum_context_error_cases(struct aws_allocat struct aws_byte_cursor wrong_size_checksum = aws_byte_cursor_from_c_str("short"); struct aws_s3_upload_request_checksum_context *context = aws_s3_upload_request_checksum_context_new_with_existing_base64_checksum( - allocator, &config, wrong_size_checksum); + allocator, &config, wrong_size_checksum, false); ASSERT_NULL(context); /* Test helper functions with NULL context */ @@ -89,7 +89,7 @@ static int s_test_upload_request_checksum_context_error_cases(struct aws_allocat .has_full_object_checksum = false, }; struct aws_s3_upload_request_checksum_context *context2 = - aws_s3_upload_request_checksum_context_new(allocator, &config2); + aws_s3_upload_request_checksum_context_new(allocator, &config2, false); ASSERT_NOT_NULL(context2); ASSERT_FALSE(aws_s3_upload_request_checksum_context_should_calculate(context2)); @@ -102,7 +102,7 @@ static int s_test_upload_request_checksum_context_error_cases(struct aws_allocat .has_full_object_checksum = false, }; struct aws_s3_upload_request_checksum_context *context3 = - aws_s3_upload_request_checksum_context_new(allocator, &config3); + aws_s3_upload_request_checksum_context_new(allocator, &config3, false); ASSERT_NOT_NULL(context3); ASSERT_FALSE(aws_s3_upload_request_checksum_context_should_calculate(context3)); @@ -131,7 +131,7 @@ static int s_test_upload_request_checksum_context_different_algorithms(struct aw AWS_ZERO_STRUCT(config.full_object_checksum); struct aws_s3_upload_request_checksum_context *context = - aws_s3_upload_request_checksum_context_new(allocator, &config); + aws_s3_upload_request_checksum_context_new(allocator, &config, false); ASSERT_NOT_NULL(context); ASSERT_INT_EQUALS(algorithms[i], context->algorithm); ASSERT_INT_EQUALS(AWS_SCL_HEADER, context->location); diff --git a/tests/s3_checksum_stream_test.c b/tests/s3_checksum_stream_test.c index e63b31fb6..32c49e2c1 100644 --- a/tests/s3_checksum_stream_test.c +++ b/tests/s3_checksum_stream_test.c @@ -124,7 +124,7 @@ static int s_stream_chunk( /* Create checksum context */ struct aws_s3_upload_request_checksum_context *context = - aws_s3_upload_request_checksum_context_new(allocator, &config); + aws_s3_upload_request_checksum_context_new(allocator, &config, false); if (!context) { return AWS_OP_ERR; } diff --git a/tests/s3_util_tests.c b/tests/s3_util_tests.c index 0d33b1703..de2e24a52 100644 --- a/tests/s3_util_tests.c +++ b/tests/s3_util_tests.c @@ -1059,6 +1059,8 @@ static int s_test_s3_checksum_header(struct aws_allocator *allocator, void *ctx) ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-type"))); ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-mode"))); ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-checksum-algorithm"))); + ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("x-amz-cHeCKsuM-tYpE"))); + ASSERT_FALSE(aws_s3_is_checksum_value_header_name(aws_byte_cursor_from_c_str("X-AMZ-CHECKSUM-ALGORITHM"))); aws_s3_library_clean_up(); return 0;