From f757fbb8daf8f24ffb9f87954559d429aa22904d Mon Sep 17 00:00:00 2001 From: Francisco Maxwell Date: Wed, 23 Sep 2026 15:18:21 -0300 Subject: [PATCH] Fix S3 CRT async request lifetime --- .../include/aws/s3-crt/S3CrtClient.h | 4 ++-- .../aws-cpp-sdk-s3-crt/source/S3CrtClient.cpp | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/generated/src/aws-cpp-sdk-s3-crt/include/aws/s3-crt/S3CrtClient.h b/generated/src/aws-cpp-sdk-s3-crt/include/aws/s3-crt/S3CrtClient.h index 84c40db94b7a..83c81c1077be 100644 --- a/generated/src/aws-cpp-sdk-s3-crt/include/aws/s3-crt/S3CrtClient.h +++ b/generated/src/aws-cpp-sdk-s3-crt/include/aws/s3-crt/S3CrtClient.h @@ -8739,7 +8739,7 @@ class AWS_S3CRT_API S3CrtClient : public Aws::Client::AWSXMLClient, PutObjectResponseReceivedHandler putResponseHandler; CopyObjectResponseReceivedHandler copyResponseHandler; std::shared_ptr asyncCallerContext; - const Aws::AmazonWebServiceRequest* originalRequest; + std::shared_ptr originalRequest; std::shared_ptr request; std::shared_ptr response; std::shared_ptr crtHttpRequest; @@ -8778,7 +8778,7 @@ class AWS_S3CRT_API S3CrtClient : public Aws::Client::AWSXMLClient, void InitCrtEndpointFromUri(aws_uri& endpoint_uri, const Aws::Http::URI& uri) const; void InitCommonCrtRequestOption(CrtRequestCallbackUserData* userData, aws_s3_meta_request_options* options, - const Aws::AmazonWebServiceRequest* request, const Aws::Http::URI& uri, + std::shared_ptr request, const Aws::Http::URI& uri, Aws::Http::HttpMethod method) const; using CopyObjectPropertiesOutcome = Aws::Utils::Outcome, S3CrtError>; diff --git a/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtClient.cpp b/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtClient.cpp index 5186361b14ae..92c43b5aca40 100644 --- a/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtClient.cpp +++ b/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtClient.cpp @@ -799,7 +799,7 @@ void S3CrtClient::InitCrtEndpointFromUri(aws_uri& endpoint_uri, const Aws::Http: } void S3CrtClient::InitCommonCrtRequestOption(CrtRequestCallbackUserData* userData, aws_s3_meta_request_options* options, - const Aws::AmazonWebServiceRequest* request, const Aws::Http::URI& uri, + std::shared_ptr request, const Aws::Http::URI& uri, Aws::Http::HttpMethod method) const { std::shared_ptr httpRequest(nullptr); if (request) { @@ -812,7 +812,7 @@ void S3CrtClient::InitCommonCrtRequestOption(CrtRequestCallbackUserData* userDat std::shared_ptr httpResponse = Aws::MakeShared(ALLOCATION_TAG, httpRequest); userData->s3CrtClient = this; - userData->originalRequest = request; + userData->originalRequest = std::move(request); userData->request = httpRequest; userData->response = httpResponse; @@ -1000,7 +1000,7 @@ static void CopyObjectRequestShutdownCallback(void* user_data) { userData->asyncCallerContext->GetMonitorContext().OnRequestSucceeded(userData->request, userData->response); } } - userData->copyResponseHandler(userData->s3CrtClient, *(reinterpret_cast(userData->originalRequest)), + userData->copyResponseHandler(userData->s3CrtClient, *(static_cast(userData->originalRequest.get())), std::move(outcome), userData->asyncCallerContext); Aws::Delete(userData); @@ -1071,7 +1071,8 @@ void S3CrtClient::CopyObjectAsync(const CopyObjectRequest& request, const CopyOb if (handlerContext) { userData->asyncCallerContext = handlerContext; } - InitCommonCrtRequestOption(userData, &options, &request, endpointResolutionOutcome.GetResult().GetURI(), Aws::Http::HttpMethod::HTTP_PUT); + auto requestCopy = Aws::MakeShared(ALLOCATION_TAG, request); + InitCommonCrtRequestOption(userData, &options, requestCopy, endpointResolutionOutcome.GetResult().GetURI(), Aws::Http::HttpMethod::HTTP_PUT); if (userData != nullptr && userData->request != nullptr && userData->request->GetContentBody() != nullptr && userData->request->GetContentBody()->fail()) { return handler(this, request, @@ -1245,7 +1246,7 @@ static void GetObjectRequestShutdownCallback(void* user_data) { userData->asyncCallerContext->GetMonitorContext().OnRequestSucceeded(userData->request, userData->response); } } - userData->getResponseHandler(userData->s3CrtClient, *(reinterpret_cast(userData->originalRequest)), + userData->getResponseHandler(userData->s3CrtClient, *(static_cast(userData->originalRequest.get())), std::move(outcome), userData->asyncCallerContext); Aws::Delete(userData); @@ -1309,7 +1310,8 @@ void S3CrtClient::GetObjectAsync(const GetObjectRequest& request, const GetObjec if (handlerContext) { userData->asyncCallerContext = handlerContext; } - InitCommonCrtRequestOption(userData, &options, &request, endpointResolutionOutcome.GetResult().GetURI(), Aws::Http::HttpMethod::HTTP_GET); + auto requestCopy = Aws::MakeShared(ALLOCATION_TAG, request); + InitCommonCrtRequestOption(userData, &options, requestCopy, endpointResolutionOutcome.GetResult().GetURI(), Aws::Http::HttpMethod::HTTP_GET); if (userData != nullptr && userData->request != nullptr && userData->request->GetContentBody() != nullptr && userData->request->GetContentBody()->fail()) { return handler(this, request, @@ -1406,7 +1408,7 @@ static void PutObjectRequestShutdownCallback(void* user_data) { userData->asyncCallerContext->GetMonitorContext().OnRequestSucceeded(userData->request, userData->response); } } - userData->putResponseHandler(userData->s3CrtClient, *(reinterpret_cast(userData->originalRequest)), + userData->putResponseHandler(userData->s3CrtClient, *(static_cast(userData->originalRequest.get())), std::move(outcome), userData->asyncCallerContext); Aws::Delete(userData); @@ -1470,7 +1472,8 @@ void S3CrtClient::PutObjectAsync(const PutObjectRequest& request, const PutObjec if (handlerContext) { userData->asyncCallerContext = handlerContext; } - InitCommonCrtRequestOption(userData, &options, &request, endpointResolutionOutcome.GetResult().GetURI(), Aws::Http::HttpMethod::HTTP_PUT); + auto requestCopy = Aws::MakeShared(ALLOCATION_TAG, request); + InitCommonCrtRequestOption(userData, &options, requestCopy, endpointResolutionOutcome.GetResult().GetURI(), Aws::Http::HttpMethod::HTTP_PUT); if (userData != nullptr && userData->request != nullptr && userData->request->GetContentBody() != nullptr && userData->request->GetContentBody()->fail()) { return handler(this, request,