Fix memory leak in the Tizen::Security::Cert namespace
authorso.yu <so.yu@samsung.com>
Thu, 25 Apr 2013 04:55:02 +0000 (13:55 +0900)
committerso.yu <so.yu@samsung.com>
Thu, 25 Apr 2013 04:55:56 +0000 (13:55 +0900)
Change-Id: I29ff43b515a8a841f07462b1a3f32d51d7034870
Signed-off-by: so.yu <so.yu@samsung.com>
src/security/cert/FSecCert_Base64.cpp
src/security/cert/FSecCert_CertDbManager.cpp
src/security/cert/FSecCert_CertManager.cpp

index fadeed5..c36bc82 100644 (file)
@@ -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())
index db1bf4a..2519f2e 100755 (executable)
 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.");
index 25155f6..71de351 100644 (file)
@@ -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<unsigned char[]> 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<void*>(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<byte*>(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<byte*>(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);