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