Skip to content

Getting a Valgrind error #35

Closed
Closed
@rix0rrr

Description

@rix0rrr

I don't know if I'm missing some define flags, but if I'm uderstanding everything correctly the SDK seems to be producing an error in Valgrind and the mistake looks legit.

==18132== Thread 3:
==18132== Mismatched free() / delete / delete []
==18132==    at 0x4C2D860: operator delete[](void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==18132==    by 0x133400A: std::default_delete<unsigned char []>::operator()(unsigned char*) const (unique_ptr.h:119)
==18132==    by 0x1333776: std::unique_ptr<unsigned char, std::default_delete<unsigned char []> >::~unique_ptr() (unique_ptr.h:236)
==18132==    by 0x13333E7: Aws::Utils::Array<unsigned char>::~Array() (Array.h:39)
==18132==    by 0x1332F5E: Aws::Client::AWSAuthV4Signer::ComputePayloadHash(Aws::Http::HttpRequest&) const (AWSAuthSigner.cpp:339)
==18132==    by 0x1330868: Aws::Client::AWSAuthV4Signer::SignRequest(Aws::Http::HttpRequest&) const (AWSAuthSigner.cpp:120)
==18132==    by 0x133C72F: Aws::Client::AWSClient::AttemptOneRequest(std::string const&, Aws::AmazonWebServiceRequest const&, Aws::Http::HttpMethod) const (AWSClient.cpp:125)
==18132==    by 0x133C23D: Aws::Client::AWSClient::AttemptExhaustively(std::string const&, Aws::AmazonWebServiceRequest const&, Aws::Http::HttpMethod) const (AWSClient.cpp:76)
==18132==    by 0x133E78C: Aws::Client::AWSXMLClient::MakeRequest(std::string const&, Aws::AmazonWebServiceRequest const&, Aws::Http::HttpMethod) const (AWSClient.cpp:376)
==18132==    by 0x11AD4F8: Aws::S3::S3Client::PutObject(Aws::S3::Model::PutObjectRequest const&) const (S3Client.cpp:1659)
==18132==    by 0x12B62A3: Aws::Utils::Outcome<Aws::S3::Model::PutObjectResult, Aws::Client::AWSError<Aws::S3::S3Errors> > std::_Mem_fn<Aws::Utils::Outcome<Aws::S3::Model::PutObjectResult, Aws::Client::AWSError<Aws::S3::S3Errors> > (Aws::S3::S3Client::*)(Aws::S3::Model::PutObjectRequest const&) const>::operator()<Aws::S3::Model::PutObjectRequest, void>(Aws::S3::S3Client const*, Aws::S3::Model::PutObjectRequest&&) const (in /home/vagrant/bruce/linuxbuild/s3kv/s3kv)
==18132==    by 0x12B1E93: Aws::Utils::Outcome<Aws::S3::Model::PutObjectResult, Aws::Client::AWSError<Aws::S3::S3Errors> > std::_Bind_simple<std::_Mem_fn<Aws::Utils::Outcome<Aws::S3::Model::PutObjectResult, Aws::Client::AWSError<Aws::S3::S3Errors> > (Aws::S3::S3Client::*)(Aws::S3::Model::PutObjectRequest const&) const> (Aws::S3::S3Client const*, Aws::S3::Model::PutObjectRequest)>::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) (functional:1700)
==18132==  Address 0xb73c080 is 0 bytes inside a block of size 32 alloc'd
==18132==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==18132==    by 0x135D269: Aws::Malloc(char const*, unsigned long) (AWSMemory.cpp:84)
==18132==    by 0x1334093: unsigned char* Aws::NewArray<unsigned char>(unsigned long, char const*) (AWSMemory.h:97)
==18132==    by 0x13338EA: Aws::Utils::Array<unsigned char>::Array(Aws::Utils::Array<unsigned char> const&) (Array.h:72)
==18132==    by 0x1332E31: Aws::Client::AWSAuthV4Signer::ComputePayloadHash(Aws::Http::HttpRequest&) const (AWSAuthSigner.cpp:339)
==18132==    by 0x1330868: Aws::Client::AWSAuthV4Signer::SignRequest(Aws::Http::HttpRequest&) const (AWSAuthSigner.cpp:120)
==18132==    by 0x133C72F: Aws::Client::AWSClient::AttemptOneRequest(std::string const&, Aws::AmazonWebServiceRequest const&, Aws::Http::HttpMethod) const (AWSClient.cpp:125)
==18132==    by 0x133C23D: Aws::Client::AWSClient::AttemptExhaustively(std::string const&, Aws::AmazonWebServiceRequest const&, Aws::Http::HttpMethod) const (AWSClient.cpp:76)
==18132==    by 0x133E78C: Aws::Client::AWSXMLClient::MakeRequest(std::string const&, Aws::AmazonWebServiceRequest const&, Aws::Http::HttpMethod) const (AWSClient.cpp:376)
==18132==    by 0x11AD4F8: Aws::S3::S3Client::PutObject(Aws::S3::Model::PutObjectRequest const&) const (S3Client.cpp:1659)
==18132==    by 0x12B62A3: Aws::Utils::Outcome<Aws::S3::Model::PutObjectResult, Aws::Client::AWSError<Aws::S3::S3Errors> > std::_Mem_fn<Aws::Utils::Outcome<Aws::S3::Model::PutObjectResult, Aws::Client::AWSError<Aws::S3::S3Errors> > (Aws::S3::S3Client::*)(Aws::S3::Model::PutObjectRequest const&) const>::operator()<Aws::S3::Model::PutObjectRequest, void>(Aws::S3::S3Client const*, Aws::S3::Model::PutObjectRequest&&) const (in /home/vagrant/bruce/linuxbuild/s3kv/s3kv)
==18132==    by 0x12B1E93: Aws::Utils::Outcome<Aws::S3::Model::PutObjectResult, Aws::Client::AWSError<Aws::S3::S3Errors> > std::_Bind_simple<std::_Mem_fn<Aws::Utils::Outcome<Aws::S3::Model::PutObjectResult, Aws::Client::AWSError<Aws::S3::S3Errors> > (Aws::S3::S3Client::*)(Aws::S3::Model::PutObjectRequest const&) const> (Aws::S3::S3Client const*, Aws::S3::Model::PutObjectRequest)>::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) (functional:1700)

When I don't define AWS_CUSTOM_MEMORY_MANAGEMENT, then in AWSMemory.h the ArrayDeleter type gets defined as a deleter of an array type, and UniqueArrayPtr is going to use either that deleter or a deleter that calls DeleteArray, which ultimately does free.

However Array.h contains (in a couple of places):

 m_data.reset(Aws::NewArray<T>(m_size, ARRAY_ALLOCATION_TAG));

Where m_data is one of those UniqueArrayPtrs.

The data ALWAYS gets malloced, but when compiled without AWS_CUSTOM_MEMORY_MANAGEMENT, the data gets delete[]d instead of freed, which is an error.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions