[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
pkey = EVP_PKEY_new();
spki = NETSCAPE_SPKI_new();
pkey = EVP_PKEY_new();
spki = NETSCAPE_SPKI_new();
if (!EVP_PKEY_assign_RSA(pkey, rsa))
return SSLErrorHandler(rsa, pkey, spki);
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))
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()))
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()))
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);
char* spkistr = NETSCAPE_SPKI_b64_encode(spki);
String result(spkistr);
return s_SSLPrivateKeyStoreTizen;
}
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)
}
EVP_PKEY* SSLPrivateKeyStoreTizen::fetchPrivateKey(const KURL& url)
static SSLPrivateKeyStoreTizen* getInstance();
static SSLPrivateKeyStoreTizen* getInstance();
- bool storePrivateKey(const KURL&, EVP_PKEY*);
+ void storePrivateKey(const KURL&, EVP_PKEY*);
EVP_PKEY* fetchPrivateKey(const KURL&);
private:
EVP_PKEY* fetchPrivateKey(const KURL&);
private: