The code below deadlocks against itself in some systems because
EVP_PKEY_free call CRYPTO_add with CRYPTO_LOCK_EVP_PKEY.

-Costa

--- openssl-0.9.8t/crypto/asn1/x_pubkey.c       2005-07-16 04:13:04.000000000 -0
700
+++ openssl-0.9.8x/crypto/asn1/x_pubkey.c       2012-05-10 10:51:28.000000000 -0
700
@@ -367,7 +367,16 @@
                goto err;
                }

-       key->pkey = ret;
+       /* Check to see if another thread set key->pkey first */
+       CRYPTO_w_lock(CRYPTO_LOCK_EVP_PKEY);
+       if (key->pkey)
+               {
+               EVP_PKEY_free(ret);
+               ret = key->pkey;
+               }
+       else
+               key->pkey = ret;
+       CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY);
        CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_EVP_PKEY);
        return(ret);
 err:
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to