summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2012-05-11 13:49:15 +0000
committerDr. Stephen Henson <steve@openssl.org>2012-05-11 13:49:15 +0000
commit4baee3031cf5529f519756b7a30bd5b078980c74 (patch)
tree71d1fd81ccbb400125a2fd551be86405eccac742 /crypto
parentdb7a72b2247f536d74dec9c5afc5e964688a3326 (diff)
PR: 2813
Reported by: Constantine Sapuntzakis <csapuntz@gmail.com> Fix possible deadlock when decoding public keys.
Diffstat (limited to 'crypto')
-rw-r--r--crypto/asn1/x_pubkey.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/crypto/asn1/x_pubkey.c b/crypto/asn1/x_pubkey.c
index 94d9f7ebab..bc8a7bf327 100644
--- a/crypto/asn1/x_pubkey.c
+++ b/crypto/asn1/x_pubkey.c
@@ -371,12 +371,15 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key)
CRYPTO_w_lock(CRYPTO_LOCK_EVP_PKEY);
if (key->pkey)
{
+ CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY);
EVP_PKEY_free(ret);
ret = key->pkey;
}
else
+ {
key->pkey = ret;
- CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY);
+ CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY);
+ }
CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_EVP_PKEY);
return(ret);
err: