From 88bd251de38ab12b9169b223e9638608e56fe8ca Mon Sep 17 00:00:00 2001 From: "so.yu" Date: Thu, 25 Apr 2013 13:55:02 +0900 Subject: [PATCH] Fix memory leak in the Tizen::Security::Cert namespace Change-Id: I29ff43b515a8a841f07462b1a3f32d51d7034870 Signed-off-by: so.yu --- src/security/cert/FSecCert_Base64.cpp | 2 +- src/security/cert/FSecCert_CertDbManager.cpp | 13 ++++++++++++- src/security/cert/FSecCert_CertManager.cpp | 23 +++++++++++++++++------ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/security/cert/FSecCert_Base64.cpp b/src/security/cert/FSecCert_Base64.cpp index fadeed5..c36bc82 100644 --- a/src/security/cert/FSecCert_Base64.cpp +++ b/src/security/cert/FSecCert_Base64.cpp @@ -104,7 +104,7 @@ _Base64::Encode(byte* pIn, int inSize, char* pOut, int outSize) r = Tizen::Base::Utility::StringUtil::EncodeToBase64String(buffer, encodedStr); SysTryReturnResult(NID_SEC_CERT, !IsFailed(r), E_SYSTEM, "Failed to encode base 64 data."); - std::unique_ptr< char > pEncodedBuffer(Tizen::Base::_StringConverter::CopyToCharArrayN(encodedStr)); + std::unique_ptr< char[] > pEncodedBuffer(Tizen::Base::_StringConverter::CopyToCharArrayN(encodedStr)); SysTryReturn(NID_SEC_CERT, pEncodedBuffer != null, GetLastResult(), GetLastResult(), "[%s] Failed to convert string to char buffer.", GetErrorMessage(GetLastResult())); if (outSize > encodedStr.GetLength()) diff --git a/src/security/cert/FSecCert_CertDbManager.cpp b/src/security/cert/FSecCert_CertDbManager.cpp index db1bf4a..2519f2e 100755 --- a/src/security/cert/FSecCert_CertDbManager.cpp +++ b/src/security/cert/FSecCert_CertDbManager.cpp @@ -47,6 +47,17 @@ using namespace Tizen::Base; using namespace Tizen::Io; +namespace +{ +struct ByteDeleter +{ + void operator ()(byte* c) + { + free(c); + } +}; +} + namespace Tizen { namespace Security { namespace Cert { _CertDbManager* _CertDbManager::__pCertDb = null; @@ -199,7 +210,7 @@ _CertDbManager::InsertCaCertificateFromBuffer(_CaCertType certType, _CertFormat SysTryReturnResult(NID_SEC_CERT, pCert != null, E_OUT_OF_MEMORY, "Failed to allocate memory."); certBufFormat = _CertManager::GetEncodedCertBuffer(pCertBuf, certLen, &pDerCert, &derCertBufferLength, &encodingType); - std::unique_ptr< byte[] > pDerCertBuffer(pDerCert); + std::unique_ptr< byte, ByteDeleter > pDerCertBuffer(pDerCert); pDerCert = null; SysTryReturnResult(NID_SEC_CERT, pDerCertBuffer != null, E_INVALID_CONDITION, "Input certificate buffer."); SysTryReturnResult(NID_SEC_CERT, certBufFormat == _CERT_X509, E_INVALID_CONDITION, "Unsupported certificate format."); diff --git a/src/security/cert/FSecCert_CertManager.cpp b/src/security/cert/FSecCert_CertManager.cpp index 25155f6..71de351 100644 --- a/src/security/cert/FSecCert_CertManager.cpp +++ b/src/security/cert/FSecCert_CertManager.cpp @@ -51,6 +51,17 @@ using namespace Tizen::Base; using namespace Tizen::System; using namespace Tizen::Io; +namespace +{ +struct ByteDeleter +{ + void operator ()(byte* c) + { + free(c); + } +}; +} + namespace Tizen { namespace Security { namespace Cert { @@ -67,7 +78,6 @@ _CertManager::CreateCrtFile(void) File fileCrt; FileAttributes attr; byte certBufData[_MAX_CERTIFICATE_SIZE] = {0, }; - const unsigned char* pCertBuffer = null; long fileSize = 0; int certBufferLen = 0; int readLength = 0; @@ -120,13 +130,14 @@ _CertManager::CreateCrtFile(void) pBio = BIO_new(BIO_s_mem()); SysTryCatch(NID_SEC_CERT, pBio != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to allocate memory."); - pCertBuffer = new (std::nothrow) unsigned char[readCnt]; + std::unique_ptr pCertBuffer(new (std::nothrow) unsigned char[readCnt]); SysTryCatch(NID_SEC_CERT, pCertBuffer != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to allocate memory."); - memcpy((void*) pCertBuffer, certBufData, readCnt); + memcpy(static_cast(pCertBuffer.get()), certBufData, readCnt); certBufferLen = readCnt; - pCert = d2i_X509(null, &pCertBuffer, certBufferLen); + const unsigned char* pTemp = pCertBuffer.get(); + pCert = d2i_X509(null, &pTemp, certBufferLen); SysTryCatch(NID_SEC_CERT, pCert != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Certificate conversion failed."); readLength = PEM_write_bio_X509(pBio, pCert); @@ -538,7 +549,7 @@ _CertManager::GetEncodedCertBuffer(byte* pCertBuffer, int certBufferLen, byte** } else if (pX509Cert->Parse(pCertBuffer, certBufferLen) == E_SUCCESS) { - std::unique_ptr< byte[] > pCertBuf(new (std::nothrow) byte[certBufferLen]); + std::unique_ptr< byte, ByteDeleter > pCertBuf(static_cast(malloc(sizeof(byte) * certBufferLen))); SysTryReturn(NID_SEC_CERT, pCertBuf != null, _CERT_UNKNOWN, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to allocate memory."); memcpy(pCertBuf.get(), pCertBuffer, certBufferLen); @@ -555,7 +566,7 @@ _CertManager::GetEncodedCertBuffer(byte* pCertBuffer, int certBufferLen, byte** certBufLen = _Base64::GetDecodedSize(certBufferLen); SysTryReturn(NID_SEC_CERT, certBufLen > 0, _CERT_UNKNOWN, E_SYSTEM, "[E_SYSTEM] Invalid certificate length."); - std::unique_ptr< byte[] > pCertBuf(new (std::nothrow) byte[certBufLen]); + std::unique_ptr< byte, ByteDeleter > pCertBuf(static_cast(malloc(sizeof(byte) * certBufLen))); SysTryReturn(NID_SEC_CERT, pCertBuf != null, _CERT_UNKNOWN, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to allocate memory."); memset(pCertBuf.get(), 0, certBufLen); -- 2.7.4