Free memory properly for keygen and generate key everytime
authorJihye Kang <jye.kang@samsung.com>
Mon, 29 Apr 2013 13:09:53 +0000 (22:09 +0900)
committerGerrit Code Review <gerrit2@kim11>
Tue, 30 Apr 2013 08:47:59 +0000 (17:47 +0900)
[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

Source/WebCore/platform/efl/tizen/SSLKeyGeneratorTizen.cpp
Source/WebCore/platform/efl/tizen/SSLPrivateKeyStoreTizen.cpp
Source/WebCore/platform/efl/tizen/SSLPrivateKeyStoreTizen.h

index 0a3d6e6..1cf67b1 100644 (file)
@@ -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);
index 55fc3c8..4abd947 100644 (file)
@@ -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<EVP_PKEY*>(m_privateKeyMap.take(url.host()));
+    if (oldPkey)
+        EVP_PKEY_free(oldPkey);
+
+    m_privateKeyMap.set(url.host(), pkey);
 }
 
 EVP_PKEY* SSLPrivateKeyStoreTizen::fetchPrivateKey(const KURL& url)
index bdf42d0..0f93f74 100644 (file)
@@ -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: