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 [email protected]
Automated List Manager [email protected]