Skip to content

Commit 65a54f1

Browse files
authored
check if md5 body is null (#2015)
Fix nullptr de-reference when body is null.
1 parent 298217c commit 65a54f1

File tree

4 files changed

+55
-5
lines changed

4 files changed

+55
-5
lines changed

aws-cpp-sdk-core/include/aws/core/client/AWSClient.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ namespace Aws
320320
void InitializeGlobalStatics();
321321
std::shared_ptr<Aws::Http::HttpRequest> ConvertToRequestForPresigning(const Aws::AmazonWebServiceRequest& request, Aws::Http::URI& uri,
322322
Aws::Http::HttpMethod method, const Aws::Http::QueryStringParameterCollection& extraParams) const;
323+
std::shared_ptr<Aws::IOStream> GetBodyStream(const Aws::AmazonWebServiceRequest& request) const;
323324

324325
std::shared_ptr<Aws::Http::HttpClient> m_httpClient;
325326
std::shared_ptr<Aws::Auth::AWSAuthSignerProvider> m_signerProvider;

aws-cpp-sdk-core/source/client/AWSClient.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,7 @@ void AWSClient::AddChecksumToRequest(const std::shared_ptr<Aws::Http::HttpReques
669669
}
670670
else
671671
{
672-
httpRequest->SetHeaderValue("x-amz-checksum-crc32", HashingUtils::Base64Encode(HashingUtils::CalculateCRC32(*(request.GetBody()))));
672+
httpRequest->SetHeaderValue("x-amz-checksum-crc32", HashingUtils::Base64Encode(HashingUtils::CalculateCRC32(*(GetBodyStream(request)))));
673673
}
674674
}
675675
else if (checksumAlgorithmName == "crc32c")
@@ -680,7 +680,7 @@ void AWSClient::AddChecksumToRequest(const std::shared_ptr<Aws::Http::HttpReques
680680
}
681681
else
682682
{
683-
httpRequest->SetHeaderValue("x-amz-checksum-crc32c", HashingUtils::Base64Encode(HashingUtils::CalculateCRC32C(*(request.GetBody()))));
683+
httpRequest->SetHeaderValue("x-amz-checksum-crc32c", HashingUtils::Base64Encode(HashingUtils::CalculateCRC32C(*(GetBodyStream(request)))));
684684
}
685685
}
686686
else if (checksumAlgorithmName == "sha256")
@@ -691,7 +691,7 @@ void AWSClient::AddChecksumToRequest(const std::shared_ptr<Aws::Http::HttpReques
691691
}
692692
else
693693
{
694-
httpRequest->SetHeaderValue("x-amz-checksum-sha256", HashingUtils::Base64Encode(HashingUtils::CalculateSHA256(*(request.GetBody()))));
694+
httpRequest->SetHeaderValue("x-amz-checksum-sha256", HashingUtils::Base64Encode(HashingUtils::CalculateSHA256(*(GetBodyStream(request)))));
695695
}
696696
}
697697
else if (checksumAlgorithmName == "sha1")
@@ -702,12 +702,12 @@ void AWSClient::AddChecksumToRequest(const std::shared_ptr<Aws::Http::HttpReques
702702
}
703703
else
704704
{
705-
httpRequest->SetHeaderValue("x-amz-checksum-sha1", HashingUtils::Base64Encode(HashingUtils::CalculateSHA1(*(request.GetBody()))));
705+
httpRequest->SetHeaderValue("x-amz-checksum-sha1", HashingUtils::Base64Encode(HashingUtils::CalculateSHA1(*(GetBodyStream(request)))));
706706
}
707707
}
708708
else if (checksumAlgorithmName == "md5")
709709
{
710-
httpRequest->SetHeaderValue(Http::CONTENT_MD5_HEADER, HashingUtils::Base64Encode(HashingUtils::CalculateMD5(*(request.GetBody()))));
710+
httpRequest->SetHeaderValue(Http::CONTENT_MD5_HEADER, HashingUtils::Base64Encode(HashingUtils::CalculateMD5(*(GetBodyStream(request)))));
711711
}
712712
else
713713
{
@@ -1027,6 +1027,13 @@ std::shared_ptr<Aws::Http::HttpRequest> AWSClient::ConvertToRequestForPresigning
10271027
return httpRequest;
10281028
}
10291029

1030+
std::shared_ptr<Aws::IOStream> AWSClient::GetBodyStream(const Aws::AmazonWebServiceRequest& request) const {
1031+
if (request.GetBody() != nullptr) {
1032+
return request.GetBody();
1033+
}
1034+
return Aws::MakeShared<Aws::IOStream>(AWS_CLIENT_LOG_TAG, nullptr);
1035+
}
1036+
10301037
std::shared_ptr<Aws::Http::HttpResponse> AWSClient::MakeHttpRequest(std::shared_ptr<Aws::Http::HttpRequest>& request) const
10311038
{
10321039
return m_httpClient->MakeRequest(request, m_readRateLimiter.get(), m_writeRateLimiter.get());

aws-cpp-sdk-s3-crt-integration-tests/BucketAndObjectOperationTest.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,4 +1514,25 @@ namespace
15141514
ASSERT_STREQ("s3-object-lambda-fips.us-gov-east-1.amazonaws.com", S3CrtEndpoint::ForRegion("fips-us-gov-east-1", false, true, "s3-object-lambda").c_str());
15151515
ASSERT_STREQ("s3-object-lambda-fips.us-gov-west-1.amazonaws.com", S3CrtEndpoint::ForRegion("us-gov-west-1-fips", false, true, "s3-object-lambda").c_str());
15161516
}
1517+
1518+
TEST_F(BucketAndObjectOperationTest, TestEmptyBody) {
1519+
Aws::String fullBucketName = CalculateBucketName(BASE_PUT_OBJECTS_BUCKET_NAME.c_str());
1520+
1521+
CreateBucketRequest createBucketRequest;
1522+
createBucketRequest.SetBucket(fullBucketName);
1523+
createBucketRequest.SetACL(BucketCannedACL::private_);
1524+
1525+
CreateBucketOutcome createBucketOutcome = Client->CreateBucket(createBucketRequest);
1526+
ASSERT_TRUE(createBucketOutcome.IsSuccess());
1527+
const CreateBucketResult& createBucketResult = createBucketOutcome.GetResult();
1528+
ASSERT_TRUE(!createBucketResult.GetLocation().empty());
1529+
ASSERT_TRUE(WaitForBucketToPropagate(fullBucketName));
1530+
TagTestBucket(fullBucketName, Client);
1531+
1532+
PutObjectRequest putObjectRequest;
1533+
putObjectRequest.SetBucket(fullBucketName);
1534+
putObjectRequest.SetKey("sbiscigl_was_here");
1535+
PutObjectOutcome putObjectOutcome = Client->PutObject(putObjectRequest);
1536+
ASSERT_TRUE(putObjectOutcome.IsSuccess());
1537+
}
15171538
}

aws-cpp-sdk-s3-integration-tests/BucketAndObjectOperationTest.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2890,4 +2890,25 @@ namespace
28902890
ASSERT_STREQ("s3-object-lambda-fips.us-gov-east-1.amazonaws.com", S3Endpoint::ForRegion("fips-us-gov-east-1", false, true, "s3-object-lambda").c_str());
28912891
ASSERT_STREQ("s3-object-lambda-fips.us-gov-west-1.amazonaws.com", S3Endpoint::ForRegion("us-gov-west-1-fips", false, true, "s3-object-lambda").c_str());
28922892
}
2893+
2894+
TEST_F(BucketAndObjectOperationTest, TestEmptyBody) {
2895+
Aws::String fullBucketName = CalculateBucketName(BASE_PUT_OBJECTS_BUCKET_NAME.c_str());
2896+
2897+
CreateBucketRequest createBucketRequest;
2898+
createBucketRequest.SetBucket(fullBucketName);
2899+
createBucketRequest.SetACL(BucketCannedACL::private_);
2900+
2901+
CreateBucketOutcome createBucketOutcome = Client->CreateBucket(createBucketRequest);
2902+
ASSERT_TRUE(createBucketOutcome.IsSuccess());
2903+
const CreateBucketResult& createBucketResult = createBucketOutcome.GetResult();
2904+
ASSERT_TRUE(!createBucketResult.GetLocation().empty());
2905+
ASSERT_TRUE(WaitForBucketToPropagate(fullBucketName));
2906+
TagTestBucket(fullBucketName, Client);
2907+
2908+
PutObjectRequest putObjectRequest;
2909+
putObjectRequest.SetBucket(fullBucketName);
2910+
putObjectRequest.SetKey("sbiscigl_was_here");
2911+
PutObjectOutcome putObjectOutcome = Client->PutObject(putObjectRequest);
2912+
ASSERT_TRUE(putObjectOutcome.IsSuccess());
2913+
}
28932914
}

0 commit comments

Comments
 (0)