PPC assembly pack update addendum.
[openssl.git] / crypto / asn1 / x_pubkey.c
index b087ee0132998ae575b251b9b96f097ad400934c..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;
@@ -187,7 +199,7 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key)
  */
 
 EVP_PKEY *d2i_PUBKEY(EVP_PKEY **a, const unsigned char **pp,
-                    size_t length)
+            long length)
        {
        X509_PUBKEY *xpk;
        EVP_PKEY *pktmp;
@@ -220,7 +232,7 @@ int i2d_PUBKEY(EVP_PKEY *a, unsigned char **pp)
  */
 #ifndef OPENSSL_NO_RSA
 RSA *d2i_RSA_PUBKEY(RSA **a, const unsigned char **pp,
-                   size_t length)
+            long length)
        {
        EVP_PKEY *pkey;
        RSA *key;
@@ -260,7 +272,7 @@ int i2d_RSA_PUBKEY(RSA *a, unsigned char **pp)
 
 #ifndef OPENSSL_NO_DSA
 DSA *d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp,
-                   size_t length)
+            long length)
        {
        EVP_PKEY *pkey;
        DSA *key;
@@ -299,7 +311,7 @@ int i2d_DSA_PUBKEY(DSA *a, unsigned char **pp)
 #endif
 
 #ifndef OPENSSL_NO_EC
-EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, size_t length)
+EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, long length)
        {
        EVP_PKEY *pkey;
        EC_KEY *key;