summaryrefslogtreecommitdiff
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
parentdb7a72b2247f536d74dec9c5afc5e964688a3326 (diff)
downloadopenssl-new-4baee3031cf5529f519756b7a30bd5b078980c74.tar.gz
PR: 2813
Reported by: Constantine Sapuntzakis <csapuntz@gmail.com> Fix possible deadlock when decoding public keys.
-rw-r--r--CHANGES3
-rw-r--r--crypto/asn1/x_pubkey.c5
2 files changed, 6 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 559a8f6736..0831bb316f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4,7 +4,8 @@
Changes between 0.9.8x and 0.9.8y [xx XXX xxxx]
- *)
+ *) Fix possible deadlock when decoding public keys.
+ [Steve Henson]
Changes between 0.9.8w and 0.9.8x [10 May 2012]
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: