From: Jihye Kang Date: Mon, 29 Apr 2013 13:09:53 +0000 (+0900) Subject: Free memory properly for keygen and generate key everytime X-Git-Tag: submit/tizen_2.1/20130514.045449~80 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2c1c81e371e542b56bd7435e933a0e9815853ffc;p=framework%2Fweb%2Fwebkit-efl.git Free memory properly for keygen and generate key everytime [Title] Free memory properly for keygen and generate key everytime [Issue#] P130426-7863 [Problem] Browser closed when using keygen twice [Cause] Free already freed memory [Solution] EVP_PKEY_assign_RSA(EVP_PKEY *pkey, RSA *key) uses the supplied key internally so key will be freed when the parent pkey is freed. So do not free RSA if RSA is successfully assigned to PKEY. Additionally, remove unnecessary RSA_new() for avoiding memory leak. Also make keygen generate key for every submit press as it is the same behavior of other browsers. Change-Id: Ie146c3c78698a0dd65190424afa7f861be5a08ac --- diff --git a/Source/WebCore/platform/efl/tizen/SSLKeyGeneratorTizen.cpp b/Source/WebCore/platform/efl/tizen/SSLKeyGeneratorTizen.cpp index 0a3d6e6..1cf67b1 100644 --- a/Source/WebCore/platform/efl/tizen/SSLKeyGeneratorTizen.cpp +++ b/Source/WebCore/platform/efl/tizen/SSLKeyGeneratorTizen.cpp @@ -76,7 +76,6 @@ String signedPublicKeyAndChallengeString(unsigned keySizeIndex, const String& ch return String(); } - rsa = RSA_new(); pkey = EVP_PKEY_new(); spki = NETSCAPE_SPKI_new(); @@ -88,17 +87,16 @@ String signedPublicKeyAndChallengeString(unsigned keySizeIndex, const String& ch if (!EVP_PKEY_assign_RSA(pkey, rsa)) return SSLErrorHandler(rsa, pkey, spki); - if (!SSLPrivateKeyStoreTizen::getInstance()->storePrivateKey(url, pkey)) - return SSLErrorHandler(rsa, pkey, spki); + SSLPrivateKeyStoreTizen::getInstance()->storePrivateKey(url, pkey); if (!NETSCAPE_SPKI_set_pubkey(spki, pkey)) - return SSLErrorHandler(rsa, pkey, spki); + return SSLErrorHandler(0, pkey, spki); if (!ASN1_STRING_set((ASN1_STRING *)spki->spkac->challenge, challengeString.utf8().data(), challengeString.length())) - return SSLErrorHandler(rsa, pkey, spki); + return SSLErrorHandler(0, pkey, spki); if (!NETSCAPE_SPKI_sign(spki, pkey, EVP_md5())) - return SSLErrorHandler(rsa, pkey, spki); + return SSLErrorHandler(0, pkey, spki); char* spkistr = NETSCAPE_SPKI_b64_encode(spki); String result(spkistr); diff --git a/Source/WebCore/platform/efl/tizen/SSLPrivateKeyStoreTizen.cpp b/Source/WebCore/platform/efl/tizen/SSLPrivateKeyStoreTizen.cpp index 55fc3c8..4abd947 100644 --- a/Source/WebCore/platform/efl/tizen/SSLPrivateKeyStoreTizen.cpp +++ b/Source/WebCore/platform/efl/tizen/SSLPrivateKeyStoreTizen.cpp @@ -57,10 +57,13 @@ SSLPrivateKeyStoreTizen* SSLPrivateKeyStoreTizen::getInstance() return s_SSLPrivateKeyStoreTizen; } -bool SSLPrivateKeyStoreTizen::storePrivateKey(const KURL& url, EVP_PKEY* pkey) +void SSLPrivateKeyStoreTizen::storePrivateKey(const KURL& url, EVP_PKEY* pkey) { - PrivateKeyMap::AddResult result = m_privateKeyMap.set(url.host(), pkey); - return result.isNewEntry; + EVP_PKEY* oldPkey = static_cast(m_privateKeyMap.take(url.host())); + if (oldPkey) + EVP_PKEY_free(oldPkey); + + m_privateKeyMap.set(url.host(), pkey); } EVP_PKEY* SSLPrivateKeyStoreTizen::fetchPrivateKey(const KURL& url) diff --git a/Source/WebCore/platform/efl/tizen/SSLPrivateKeyStoreTizen.h b/Source/WebCore/platform/efl/tizen/SSLPrivateKeyStoreTizen.h index bdf42d0..0f93f74 100644 --- a/Source/WebCore/platform/efl/tizen/SSLPrivateKeyStoreTizen.h +++ b/Source/WebCore/platform/efl/tizen/SSLPrivateKeyStoreTizen.h @@ -47,7 +47,7 @@ public: static SSLPrivateKeyStoreTizen* getInstance(); - bool storePrivateKey(const KURL&, EVP_PKEY*); + void storePrivateKey(const KURL&, EVP_PKEY*); EVP_PKEY* fetchPrivateKey(const KURL&); private: