From f8a2c9f1f9bebe30deb1efa91b4d9fb616d0e768 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 4 Sep 2025 10:24:02 -0700 Subject: [PATCH 1/6] why? --- source/credentials_provider_sts_web_identity.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/credentials_provider_sts_web_identity.c b/source/credentials_provider_sts_web_identity.c index 229304f6..f96b38ee 100644 --- a/source/credentials_provider_sts_web_identity.c +++ b/source/credentials_provider_sts_web_identity.c @@ -527,9 +527,7 @@ static void s_on_stream_complete_fn(struct aws_http_stream *stream, int error_co struct sts_web_identity_user_data *user_data = data; struct aws_credentials_provider_sts_web_identity_impl *impl = user_data->sts_web_identity_provider->impl; - struct aws_http_connection *connection = impl->function_table->aws_http_stream_get_connection(stream); impl->function_table->aws_http_stream_release(stream); - impl->function_table->aws_http_connection_manager_release_connection(impl->connection_manager, connection); /* * On anything other than a 200, if we can retry the request based on From 7750185349e4847f276869d34e36744ad51d52de Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 4 Sep 2025 10:36:10 -0700 Subject: [PATCH 2/6] Revert "why?" This reverts commit f8a2c9f1f9bebe30deb1efa91b4d9fb616d0e768. --- source/credentials_provider_sts_web_identity.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/credentials_provider_sts_web_identity.c b/source/credentials_provider_sts_web_identity.c index f96b38ee..229304f6 100644 --- a/source/credentials_provider_sts_web_identity.c +++ b/source/credentials_provider_sts_web_identity.c @@ -527,7 +527,9 @@ static void s_on_stream_complete_fn(struct aws_http_stream *stream, int error_co struct sts_web_identity_user_data *user_data = data; struct aws_credentials_provider_sts_web_identity_impl *impl = user_data->sts_web_identity_provider->impl; + struct aws_http_connection *connection = impl->function_table->aws_http_stream_get_connection(stream); impl->function_table->aws_http_stream_release(stream); + impl->function_table->aws_http_connection_manager_release_connection(impl->connection_manager, connection); /* * On anything other than a 200, if we can retry the request based on From 721e5749428ef94cbabc50c52b7792b58c6c4080 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 4 Sep 2025 10:42:32 -0700 Subject: [PATCH 3/6] make sure the test can catch this --- ...redentials_provider_sts_web_identity_tests.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/credentials_provider_sts_web_identity_tests.c b/tests/credentials_provider_sts_web_identity_tests.c index 066d2615..7d7c940f 100644 --- a/tests/credentials_provider_sts_web_identity_tests.c +++ b/tests/credentials_provider_sts_web_identity_tests.c @@ -71,6 +71,8 @@ struct mock_connection_manager { struct aws_allocator *allocator; aws_http_connection_manager_shutdown_complete_fn *shutdown_complete_callback; void *shutdown_complete_user_data; + + int count; }; static struct aws_http_connection_manager *s_aws_http_connection_manager_new_mock( @@ -86,6 +88,7 @@ static struct aws_http_connection_manager *s_aws_http_connection_manager_new_moc static void s_aws_http_connection_manager_release_mock(struct aws_http_connection_manager *manager) { struct mock_connection_manager *mock_manager = (struct mock_connection_manager *)manager; + AWS_ASSERT(mock_manager->count == 0 && "count should dropped to zero when the manager is gone."); mock_manager->shutdown_complete_callback(mock_manager->shutdown_complete_user_data); aws_mem_release(mock_manager->allocator, mock_manager); } @@ -94,11 +97,8 @@ static void s_aws_http_connection_manager_acquire_connection_mock( struct aws_http_connection_manager *manager, aws_http_connection_manager_on_connection_setup_fn *callback, void *user_data) { - - (void)manager; - (void)callback; - (void)user_data; - + struct mock_connection_manager *mock_manager = (struct mock_connection_manager *)manager; + mock_manager->count++; if (s_tester.is_connection_acquire_successful) { callback((struct aws_http_connection *)1, AWS_OP_SUCCESS, user_data); } else { @@ -111,8 +111,11 @@ static int s_aws_http_connection_manager_release_connection_mock( struct aws_http_connection_manager *manager, struct aws_http_connection *connection) { - (void)manager; - (void)connection; + struct mock_connection_manager *mock_manager = (struct mock_connection_manager *)manager; + mock_manager->count--; + AWS_ASSERT( + connection == (struct aws_http_connection *)1 && "the released connection should be the same as vended one"); + AWS_ASSERT(mock_manager->count >= 0 && "count should always be positive"); return AWS_OP_SUCCESS; } From bfcdc2c3f1c92047b0f4baa8c52ebef37a7540f1 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 4 Sep 2025 10:49:59 -0700 Subject: [PATCH 4/6] use a better assert --- tests/credentials_provider_sts_web_identity_tests.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/credentials_provider_sts_web_identity_tests.c b/tests/credentials_provider_sts_web_identity_tests.c index 7d7c940f..028beb99 100644 --- a/tests/credentials_provider_sts_web_identity_tests.c +++ b/tests/credentials_provider_sts_web_identity_tests.c @@ -88,7 +88,7 @@ static struct aws_http_connection_manager *s_aws_http_connection_manager_new_moc static void s_aws_http_connection_manager_release_mock(struct aws_http_connection_manager *manager) { struct mock_connection_manager *mock_manager = (struct mock_connection_manager *)manager; - AWS_ASSERT(mock_manager->count == 0 && "count should dropped to zero when the manager is gone."); + AWS_FATAL_ASSERT(mock_manager->count == 0 && "count should dropped to zero when the manager is gone."); mock_manager->shutdown_complete_callback(mock_manager->shutdown_complete_user_data); aws_mem_release(mock_manager->allocator, mock_manager); } @@ -113,9 +113,9 @@ static int s_aws_http_connection_manager_release_connection_mock( struct mock_connection_manager *mock_manager = (struct mock_connection_manager *)manager; mock_manager->count--; - AWS_ASSERT( + ASSERT_TRUE( connection == (struct aws_http_connection *)1 && "the released connection should be the same as vended one"); - AWS_ASSERT(mock_manager->count >= 0 && "count should always be positive"); + ASSERT_TRUE(mock_manager->count >= 0 && "count should always be positive"); return AWS_OP_SUCCESS; } From 8f794adcf2e6efb3ab23d0d67eb402c8c6c4507f Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 4 Sep 2025 10:53:11 -0700 Subject: [PATCH 5/6] fix it --- source/credentials_provider_sts_web_identity.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/credentials_provider_sts_web_identity.c b/source/credentials_provider_sts_web_identity.c index 229304f6..f96b38ee 100644 --- a/source/credentials_provider_sts_web_identity.c +++ b/source/credentials_provider_sts_web_identity.c @@ -527,9 +527,7 @@ static void s_on_stream_complete_fn(struct aws_http_stream *stream, int error_co struct sts_web_identity_user_data *user_data = data; struct aws_credentials_provider_sts_web_identity_impl *impl = user_data->sts_web_identity_provider->impl; - struct aws_http_connection *connection = impl->function_table->aws_http_stream_get_connection(stream); impl->function_table->aws_http_stream_release(stream); - impl->function_table->aws_http_connection_manager_release_connection(impl->connection_manager, connection); /* * On anything other than a 200, if we can retry the request based on From 5f24f78ae5bca91c2b675fa865dd51e9ffeded8c Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 4 Sep 2025 11:03:51 -0700 Subject: [PATCH 6/6] only add the count when success --- tests/credentials_provider_sts_web_identity_tests.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/credentials_provider_sts_web_identity_tests.c b/tests/credentials_provider_sts_web_identity_tests.c index 028beb99..332e8651 100644 --- a/tests/credentials_provider_sts_web_identity_tests.c +++ b/tests/credentials_provider_sts_web_identity_tests.c @@ -98,8 +98,9 @@ static void s_aws_http_connection_manager_acquire_connection_mock( aws_http_connection_manager_on_connection_setup_fn *callback, void *user_data) { struct mock_connection_manager *mock_manager = (struct mock_connection_manager *)manager; - mock_manager->count++; + if (s_tester.is_connection_acquire_successful) { + mock_manager->count++; callback((struct aws_http_connection *)1, AWS_OP_SUCCESS, user_data); } else { aws_raise_error(AWS_ERROR_HTTP_UNKNOWN);