PPC assembly pack update addendum.
[openssl.git] / crypto / asn1 / x_pubkey.c
index d42b6a2c54cbac464edac9f8888b18d2520a38fb..b649e1fcf96ce322d5a1422cd5ae58b8ae1715fe 100644 (file)
@@ -171,7 +171,19 @@ 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)
+               {
+               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_add(&ret->references, 1, CRYPTO_LOCK_EVP_PKEY);
 
        return ret;