X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fasn1%2Fx_pubkey.c;h=627ec87f9f895502e63a8ee19b38d72d8be90013;hp=d42b6a2c54cbac464edac9f8888b18d2520a38fb;hb=dc4f678cdc12beeef9d501f32468681ac775fd76;hpb=0f2ece872d6603cda01ed5c0e333b41d28f8c67f diff --git a/crypto/asn1/x_pubkey.c b/crypto/asn1/x_pubkey.c index d42b6a2c54..627ec87f9f 100644 --- a/crypto/asn1/x_pubkey.c +++ b/crypto/asn1/x_pubkey.c @@ -171,7 +171,16 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key) goto error; } - 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;