PR: 2813
authorDr. Stephen Henson <steve@openssl.org>
Fri, 11 May 2012 13:52:46 +0000 (13:52 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Fri, 11 May 2012 13:52:46 +0000 (13:52 +0000)
Reported by: Constantine Sapuntzakis <csapuntz@gmail.com>

Fix possible deadlock when decoding public keys.

CHANGES
crypto/asn1/x_pubkey.c

diff --git a/CHANGES b/CHANGES
index ef8dff4a002244b8a866453e2d8354efac7be96a..abe3b493470314bffff120ab31dd7ef30b78de5a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,9 @@
 
  Changes between 1.0.1c and 1.0.1d [xx XXX xxxx]
 
+  *) Fix possible deadlock when decoding public keys.
+     [Steve Henson]
+
   *) Don't use TLS 1.0 record version number in initial client hello
      if renegotiating.
      [Steve Henson]
index 627ec87f9f895502e63a8ee19b38d72d8be90013..b649e1fcf96ce322d5a1422cd5ae58b8ae1715fe 100644 (file)
@@ -175,12 +175,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;