evp: update to structure based atomics
authorPauli <pauli@openssl.org>
Wed, 21 Jun 2023 23:48:49 +0000 (09:48 +1000)
committerPauli <pauli@openssl.org>
Sat, 1 Jul 2023 11:18:25 +0000 (21:18 +1000)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/21260)

15 files changed:
crypto/evp/asymcipher.c
crypto/evp/cmeth_lib.c
crypto/evp/digest.c
crypto/evp/evp_enc.c
crypto/evp/evp_lib.c
crypto/evp/evp_local.h
crypto/evp/evp_rand.c
crypto/evp/exchange.c
crypto/evp/kdf_meth.c
crypto/evp/kem.c
crypto/evp/keymgmt_meth.c
crypto/evp/mac_meth.c
crypto/evp/p_lib.c
crypto/evp/signature.c
include/crypto/evp.h

index ca2a8ebdf27e551ad64e36e62a47622d5af9bab8..c431d78a403f39fd4d2fb0586a783c2e937773f1 100644 (file)
@@ -324,15 +324,12 @@ static EVP_ASYM_CIPHER *evp_asym_cipher_new(OSSL_PROVIDER *prov)
     if (cipher == NULL)
         return NULL;
 
-    cipher->lock = CRYPTO_THREAD_lock_new();
-    if (cipher->lock == NULL) {
-        ERR_raise(ERR_LIB_EVP, ERR_R_CRYPTO_LIB);
+    if (!CRYPTO_NEW_REF(&cipher->refcnt, 1)) {
         OPENSSL_free(cipher);
         return NULL;
     }
     cipher->prov = prov;
     ossl_provider_up_ref(prov);
-    cipher->refcnt = 1;
 
     return cipher;
 }
@@ -460,12 +457,12 @@ void EVP_ASYM_CIPHER_free(EVP_ASYM_CIPHER *cipher)
 
     if (cipher == NULL)
         return;
-    CRYPTO_DOWN_REF(&cipher->refcnt, &i, cipher->lock);
+    CRYPTO_DOWN_REF(&cipher->refcnt, &i);
     if (i > 0)
         return;
     OPENSSL_free(cipher->type_name);
     ossl_provider_free(cipher->prov);
-    CRYPTO_THREAD_lock_free(cipher->lock);
+    CRYPTO_FREE_REF(&cipher->refcnt);
     OPENSSL_free(cipher);
 }
 
@@ -473,7 +470,7 @@ int EVP_ASYM_CIPHER_up_ref(EVP_ASYM_CIPHER *cipher)
 {
     int ref = 0;
 
-    CRYPTO_UP_REF(&cipher->refcnt, &ref, cipher->lock);
+    CRYPTO_UP_REF(&cipher->refcnt, &ref);
     return 1;
 }
 
index a806ec5f9e22088585dba3e0cafa42d6f1022d89..ab0d2465853adf3ebc388c5b882f2de9ccba31fa 100644 (file)
@@ -46,10 +46,10 @@ EVP_CIPHER *EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher)
 
     if ((to = EVP_CIPHER_meth_new(cipher->nid, cipher->block_size,
                                   cipher->key_len)) != NULL) {
-        CRYPTO_RWLOCK *lock = to->lock;
+        CRYPTO_REF_COUNT refcnt = to->refcnt;
 
         memcpy(to, cipher, sizeof(*to));
-        to->lock = lock;
+        to->refcnt = refcnt;
         to->origin = EVP_ORIG_METH;
     }
     return to;
index 286f5bdc63fe047765c4ae1bd370984c9408b021..9a0d1b5b08b8060b99e51355204e030dab18aae5 100644 (file)
@@ -901,13 +901,9 @@ EVP_MD *evp_md_new(void)
 {
     EVP_MD *md = OPENSSL_zalloc(sizeof(*md));
 
-    if (md != NULL) {
-        md->lock = CRYPTO_THREAD_lock_new();
-        if (md->lock == NULL) {
-            OPENSSL_free(md);
-            return NULL;
-        }
-        md->refcnt = 1;
+    if (md != NULL && !CRYPTO_NEW_REF(&md->refcnt, 1)) {
+        OPENSSL_free(md);
+        return NULL;
     }
     return md;
 }
@@ -1120,7 +1116,7 @@ int EVP_MD_up_ref(EVP_MD *md)
     int ref = 0;
 
     if (md->origin == EVP_ORIG_DYNAMIC)
-        CRYPTO_UP_REF(&md->refcnt, &ref, md->lock);
+        CRYPTO_UP_REF(&md->refcnt, &ref);
     return 1;
 }
 
@@ -1131,7 +1127,7 @@ void EVP_MD_free(EVP_MD *md)
     if (md == NULL || md->origin != EVP_ORIG_DYNAMIC)
         return;
 
-    CRYPTO_DOWN_REF(&md->refcnt, &i, md->lock);
+    CRYPTO_DOWN_REF(&md->refcnt, &i);
     if (i > 0)
         return;
     evp_md_free_int(md);
index 3187ba35c997d185075cb8e8ca8966d3d9fccefe..6b6d65163f9cc1e53baee4adf756dcdde41cc9ba 100644 (file)
@@ -1483,13 +1483,9 @@ EVP_CIPHER *evp_cipher_new(void)
 {
     EVP_CIPHER *cipher = OPENSSL_zalloc(sizeof(EVP_CIPHER));
 
-    if (cipher != NULL) {
-        cipher->lock = CRYPTO_THREAD_lock_new();
-        if (cipher->lock == NULL) {
-            OPENSSL_free(cipher);
-            return NULL;
-        }
-        cipher->refcnt = 1;
+    if (cipher != NULL && !CRYPTO_NEW_REF(&cipher->refcnt, 1)) {
+        OPENSSL_free(cipher);
+        return NULL;
     }
     return cipher;
 }
@@ -1689,7 +1685,7 @@ int EVP_CIPHER_up_ref(EVP_CIPHER *cipher)
     int ref = 0;
 
     if (cipher->origin == EVP_ORIG_DYNAMIC)
-        CRYPTO_UP_REF(&cipher->refcnt, &ref, cipher->lock);
+        CRYPTO_UP_REF(&cipher->refcnt, &ref);
     return 1;
 }
 
@@ -1697,7 +1693,7 @@ void evp_cipher_free_int(EVP_CIPHER *cipher)
 {
     OPENSSL_free(cipher->type_name);
     ossl_provider_free(cipher->prov);
-    CRYPTO_THREAD_lock_free(cipher->lock);
+    CRYPTO_FREE_REF(&cipher->refcnt);
     OPENSSL_free(cipher);
 }
 
@@ -1708,7 +1704,7 @@ void EVP_CIPHER_free(EVP_CIPHER *cipher)
     if (cipher == NULL || cipher->origin != EVP_ORIG_DYNAMIC)
         return;
 
-    CRYPTO_DOWN_REF(&cipher->refcnt, &i, cipher->lock);
+    CRYPTO_DOWN_REF(&cipher->refcnt, &i);
     if (i > 0)
         return;
     evp_cipher_free_int(cipher);
index 91f72aa930ed009954cfe55b8d90f9b80e9cb847..bc263b643021ca8756147157b94ef07b51ca6453 100644 (file)
@@ -852,10 +852,10 @@ EVP_MD *EVP_MD_meth_dup(const EVP_MD *md)
         return NULL;
 
     if ((to = EVP_MD_meth_new(md->type, md->pkey_type)) != NULL) {
-        CRYPTO_RWLOCK *lock = to->lock;
+        CRYPTO_REF_COUNT refcnt = to->refcnt;
 
         memcpy(to, md, sizeof(*to));
-        to->lock = lock;
+        to->refcnt = refcnt;
         to->origin = EVP_ORIG_METH;
     }
     return to;
@@ -865,7 +865,7 @@ void evp_md_free_int(EVP_MD *md)
 {
     OPENSSL_free(md->type_name);
     ossl_provider_free(md->prov);
-    CRYPTO_THREAD_lock_free(md->lock);
+    CRYPTO_FREE_REF(&md->refcnt);
     OPENSSL_free(md);
 }
 
index 759045e5a030874a978f3044295f14adb931ffe2..e3a1d7d53c91306004d62d4407fa2fa7f664bf28 100644 (file)
@@ -99,7 +99,6 @@ struct evp_keymgmt_st {
     const char *description;
     OSSL_PROVIDER *prov;
     CRYPTO_REF_COUNT refcnt;
-    CRYPTO_RWLOCK *lock;
 
     /* Constructor(s), destructor, information */
     OSSL_FUNC_keymgmt_new_fn *new;
@@ -141,7 +140,6 @@ struct evp_keyexch_st {
     const char *description;
     OSSL_PROVIDER *prov;
     CRYPTO_REF_COUNT refcnt;
-    CRYPTO_RWLOCK *lock;
 
     OSSL_FUNC_keyexch_newctx_fn *newctx;
     OSSL_FUNC_keyexch_init_fn *init;
@@ -161,7 +159,6 @@ struct evp_signature_st {
     const char *description;
     OSSL_PROVIDER *prov;
     CRYPTO_REF_COUNT refcnt;
-    CRYPTO_RWLOCK *lock;
 
     OSSL_FUNC_signature_newctx_fn *newctx;
     OSSL_FUNC_signature_sign_init_fn *sign_init;
@@ -196,7 +193,6 @@ struct evp_asym_cipher_st {
     const char *description;
     OSSL_PROVIDER *prov;
     CRYPTO_REF_COUNT refcnt;
-    CRYPTO_RWLOCK *lock;
 
     OSSL_FUNC_asym_cipher_newctx_fn *newctx;
     OSSL_FUNC_asym_cipher_encrypt_init_fn *encrypt_init;
@@ -217,7 +213,6 @@ struct evp_kem_st {
     const char *description;
     OSSL_PROVIDER *prov;
     CRYPTO_REF_COUNT refcnt;
-    CRYPTO_RWLOCK *lock;
 
     OSSL_FUNC_kem_newctx_fn *newctx;
     OSSL_FUNC_kem_encapsulate_init_fn *encapsulate_init;
index ed7f213bd84653c7ae9c41c9a3fab564e9da775a..e8dfd32ff71ce32358bf82001181a9180e88cb54 100644 (file)
@@ -27,7 +27,6 @@ struct evp_rand_st {
     char *type_name;
     const char *description;
     CRYPTO_REF_COUNT refcnt;
-    CRYPTO_RWLOCK *refcnt_lock;
 
     const OSSL_DISPATCH *dispatch;
     OSSL_FUNC_rand_newctx_fn *newctx;
@@ -55,7 +54,7 @@ static int evp_rand_up_ref(void *vrand)
     int ref = 0;
 
     if (rand != NULL)
-        return CRYPTO_UP_REF(&rand->refcnt, &ref, rand->refcnt_lock);
+        return CRYPTO_UP_REF(&rand->refcnt, &ref);
     return 1;
 }
 
@@ -66,12 +65,12 @@ static void evp_rand_free(void *vrand)
 
     if (rand == NULL)
         return;
-    CRYPTO_DOWN_REF(&rand->refcnt, &ref, rand->refcnt_lock);
+    CRYPTO_DOWN_REF(&rand->refcnt, &ref);
     if (ref > 0)
         return;
     OPENSSL_free(rand->type_name);
     ossl_provider_free(rand->prov);
-    CRYPTO_THREAD_lock_free(rand->refcnt_lock);
+    CRYPTO_FREE_REF(&rand->refcnt);
     OPENSSL_free(rand);
 }
 
@@ -79,12 +78,10 @@ static void *evp_rand_new(void)
 {
     EVP_RAND *rand = OPENSSL_zalloc(sizeof(*rand));
 
-    if (rand == NULL
-            || (rand->refcnt_lock = CRYPTO_THREAD_lock_new()) == NULL) {
+    if (rand == NULL || !CRYPTO_NEW_REF(&rand->refcnt, 1)) {
         OPENSSL_free(rand);
         return NULL;
     }
-    rand->refcnt = 1;
     return rand;
 }
 
@@ -324,7 +321,7 @@ int EVP_RAND_CTX_up_ref(EVP_RAND_CTX *ctx)
 {
     int ref = 0;
 
-    return CRYPTO_UP_REF(&ctx->refcnt, &ref, ctx->refcnt_lock);
+    return CRYPTO_UP_REF(&ctx->refcnt, &ref);
 }
 
 EVP_RAND_CTX *EVP_RAND_CTX_new(EVP_RAND *rand, EVP_RAND_CTX *parent)
@@ -341,15 +338,14 @@ EVP_RAND_CTX *EVP_RAND_CTX_new(EVP_RAND *rand, EVP_RAND_CTX *parent)
     ctx = OPENSSL_zalloc(sizeof(*ctx));
     if (ctx == NULL)
         return NULL;
-    if ((ctx->refcnt_lock = CRYPTO_THREAD_lock_new()) == NULL) {
+    if (!CRYPTO_NEW_REF(&ctx->refcnt, 1)) {
         OPENSSL_free(ctx);
-        ERR_raise(ERR_LIB_EVP, ERR_R_CRYPTO_LIB);
         return NULL;
     }
     if (parent != NULL) {
         if (!EVP_RAND_CTX_up_ref(parent)) {
             ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
-            CRYPTO_THREAD_lock_free(ctx->refcnt_lock);
+            CRYPTO_FREE_REF(&ctx->refcnt);
             OPENSSL_free(ctx);
             return NULL;
         }
@@ -361,14 +357,13 @@ EVP_RAND_CTX *EVP_RAND_CTX_new(EVP_RAND *rand, EVP_RAND_CTX *parent)
             || !EVP_RAND_up_ref(rand)) {
         ERR_raise(ERR_LIB_EVP, ERR_R_EVP_LIB);
         rand->freectx(ctx->algctx);
-        CRYPTO_THREAD_lock_free(ctx->refcnt_lock);
+        CRYPTO_FREE_REF(&ctx->refcnt);
         OPENSSL_free(ctx);
         EVP_RAND_CTX_free(parent);
         return NULL;
     }
     ctx->meth = rand;
     ctx->parent = parent;
-    ctx->refcnt = 1;
     return ctx;
 }
 
@@ -380,14 +375,14 @@ void EVP_RAND_CTX_free(EVP_RAND_CTX *ctx)
     if (ctx == NULL)
         return;
 
-    CRYPTO_DOWN_REF(&ctx->refcnt, &ref, ctx->refcnt_lock);
+    CRYPTO_DOWN_REF(&ctx->refcnt, &ref);
     if (ref > 0)
         return;
     parent = ctx->parent;
     ctx->meth->freectx(ctx->algctx);
     ctx->algctx = NULL;
     EVP_RAND_free(ctx->meth);
-    CRYPTO_THREAD_lock_free(ctx->refcnt_lock);
+    CRYPTO_FREE_REF(&ctx->refcnt);
     OPENSSL_free(ctx);
     EVP_RAND_CTX_free(parent);
 }
index a9311b2792d5e85c188b0f477cde115a76175fe1..195c32cfc9b984d583e20e79f7010d80a1ff20af 100644 (file)
@@ -25,15 +25,12 @@ static EVP_KEYEXCH *evp_keyexch_new(OSSL_PROVIDER *prov)
     if (exchange == NULL)
         return NULL;
 
-    exchange->lock = CRYPTO_THREAD_lock_new();
-    if (exchange->lock == NULL) {
-        ERR_raise(ERR_LIB_EVP, ERR_R_CRYPTO_LIB);
+    if (!CRYPTO_NEW_REF(&exchange->refcnt, 1)) {
         OPENSSL_free(exchange);
         return NULL;
     }
     exchange->prov = prov;
     ossl_provider_up_ref(prov);
-    exchange->refcnt = 1;
 
     return exchange;
 }
@@ -148,12 +145,12 @@ void EVP_KEYEXCH_free(EVP_KEYEXCH *exchange)
 
     if (exchange == NULL)
         return;
-    CRYPTO_DOWN_REF(&exchange->refcnt, &i, exchange->lock);
+    CRYPTO_DOWN_REF(&exchange->refcnt, &i);
     if (i > 0)
         return;
     OPENSSL_free(exchange->type_name);
     ossl_provider_free(exchange->prov);
-    CRYPTO_THREAD_lock_free(exchange->lock);
+    CRYPTO_FREE_REF(&exchange->refcnt);
     OPENSSL_free(exchange);
 }
 
@@ -161,7 +158,7 @@ int EVP_KEYEXCH_up_ref(EVP_KEYEXCH *exchange)
 {
     int ref = 0;
 
-    CRYPTO_UP_REF(&exchange->refcnt, &ref, exchange->lock);
+    CRYPTO_UP_REF(&exchange->refcnt, &ref);
     return 1;
 }
 
index b383cc6cddbaacf8b555d2b700025cdeb618549b..c043598d07fdcd76c6eed19df6a742f46a2f084f 100644 (file)
@@ -22,7 +22,7 @@ static int evp_kdf_up_ref(void *vkdf)
     EVP_KDF *kdf = (EVP_KDF *)vkdf;
     int ref = 0;
 
-    CRYPTO_UP_REF(&kdf->refcnt, &ref, kdf->lock);
+    CRYPTO_UP_REF(&kdf->refcnt, &ref);
     return 1;
 }
 
@@ -34,12 +34,12 @@ static void evp_kdf_free(void *vkdf)
     if (kdf == NULL)
         return;
 
-    CRYPTO_DOWN_REF(&kdf->refcnt, &ref, kdf->lock);
+    CRYPTO_DOWN_REF(&kdf->refcnt, &ref);
     if (ref > 0)
         return;
     OPENSSL_free(kdf->type_name);
     ossl_provider_free(kdf->prov);
-    CRYPTO_THREAD_lock_free(kdf->lock);
+    CRYPTO_FREE_REF(&kdf->refcnt);
     OPENSSL_free(kdf);
 }
 
@@ -48,11 +48,10 @@ static void *evp_kdf_new(void)
     EVP_KDF *kdf = NULL;
 
     if ((kdf = OPENSSL_zalloc(sizeof(*kdf))) == NULL
-        || (kdf->lock = CRYPTO_THREAD_lock_new()) == NULL) {
+        || !CRYPTO_NEW_REF(&kdf->refcnt, 1)) {
         OPENSSL_free(kdf);
         return NULL;
     }
-    kdf->refcnt = 1;
     return kdf;
 }
 
index 499978fc556a5ff1d15cc326eb9379d10bc624ff..5491cabd4eeef6bd65e74530b451b864da3ccab0 100644 (file)
@@ -278,15 +278,12 @@ static EVP_KEM *evp_kem_new(OSSL_PROVIDER *prov)
     if (kem == NULL)
         return NULL;
 
-    kem->lock = CRYPTO_THREAD_lock_new();
-    if (kem->lock == NULL) {
-        ERR_raise(ERR_LIB_EVP, ERR_R_CRYPTO_LIB);
+    if (!CRYPTO_NEW_REF(&kem->refcnt, 1)) {
         OPENSSL_free(kem);
         return NULL;
     }
     kem->prov = prov;
     ossl_provider_up_ref(prov);
-    kem->refcnt = 1;
 
     return kem;
 }
@@ -428,12 +425,12 @@ void EVP_KEM_free(EVP_KEM *kem)
     if (kem == NULL)
         return;
 
-    CRYPTO_DOWN_REF(&kem->refcnt, &i, kem->lock);
+    CRYPTO_DOWN_REF(&kem->refcnt, &i);
     if (i > 0)
         return;
     OPENSSL_free(kem->type_name);
     ossl_provider_free(kem->prov);
-    CRYPTO_THREAD_lock_free(kem->lock);
+    CRYPTO_FREE_REF(&kem->refcnt);
     OPENSSL_free(kem);
 }
 
@@ -441,7 +438,7 @@ int EVP_KEM_up_ref(EVP_KEM *kem)
 {
     int ref = 0;
 
-    CRYPTO_UP_REF(&kem->refcnt, &ref, kem->lock);
+    CRYPTO_UP_REF(&kem->refcnt, &ref);
     return 1;
 }
 
index e7ec8ddc47605325f0ec4f0e23c0af74810fca0f..0f767eaddb5d41872af2636701e85e274c329ad6 100644 (file)
@@ -23,14 +23,10 @@ static void *keymgmt_new(void)
 
     if ((keymgmt = OPENSSL_zalloc(sizeof(*keymgmt))) == NULL)
         return NULL;
-    if ((keymgmt->lock = CRYPTO_THREAD_lock_new()) == NULL) {
+    if (!CRYPTO_NEW_REF(&keymgmt->refcnt, 1)) {
         EVP_KEYMGMT_free(keymgmt);
-        ERR_raise(ERR_LIB_EVP, ERR_R_CRYPTO_LIB);
         return NULL;
     }
-
-    keymgmt->refcnt = 1;
-
     return keymgmt;
 }
 
@@ -249,7 +245,7 @@ int EVP_KEYMGMT_up_ref(EVP_KEYMGMT *keymgmt)
 {
     int ref = 0;
 
-    CRYPTO_UP_REF(&keymgmt->refcnt, &ref, keymgmt->lock);
+    CRYPTO_UP_REF(&keymgmt->refcnt, &ref);
     return 1;
 }
 
@@ -260,12 +256,12 @@ void EVP_KEYMGMT_free(EVP_KEYMGMT *keymgmt)
     if (keymgmt == NULL)
         return;
 
-    CRYPTO_DOWN_REF(&keymgmt->refcnt, &ref, keymgmt->lock);
+    CRYPTO_DOWN_REF(&keymgmt->refcnt, &ref);
     if (ref > 0)
         return;
     OPENSSL_free(keymgmt->type_name);
     ossl_provider_free(keymgmt->prov);
-    CRYPTO_THREAD_lock_free(keymgmt->lock);
+    CRYPTO_FREE_REF(&keymgmt->refcnt);
     OPENSSL_free(keymgmt);
 }
 
index e13354826910f256c088924f8c6cad18314f7b66..a146c4afba1d2af90453dff373454db7497d56a3 100644 (file)
@@ -21,7 +21,7 @@ static int evp_mac_up_ref(void *vmac)
     EVP_MAC *mac = vmac;
     int ref = 0;
 
-    CRYPTO_UP_REF(&mac->refcnt, &ref, mac->lock);
+    CRYPTO_UP_REF(&mac->refcnt, &ref);
     return 1;
 }
 
@@ -33,12 +33,12 @@ static void evp_mac_free(void *vmac)
     if (mac == NULL)
         return;
 
-    CRYPTO_DOWN_REF(&mac->refcnt, &ref, mac->lock);
+    CRYPTO_DOWN_REF(&mac->refcnt, &ref);
     if (ref > 0)
         return;
     OPENSSL_free(mac->type_name);
     ossl_provider_free(mac->prov);
-    CRYPTO_THREAD_lock_free(mac->lock);
+    CRYPTO_FREE_REF(&mac->refcnt);
     OPENSSL_free(mac);
 }
 
@@ -47,13 +47,10 @@ static void *evp_mac_new(void)
     EVP_MAC *mac = NULL;
 
     if ((mac = OPENSSL_zalloc(sizeof(*mac))) == NULL
-        || (mac->lock = CRYPTO_THREAD_lock_new()) == NULL) {
+        || !CRYPTO_NEW_REF(&mac->refcnt, 1)) {
         evp_mac_free(mac);
         return NULL;
     }
-
-    mac->refcnt = 1;
-
     return mac;
 }
 
index b26b606505f25c295d67b759632fbbcd5f4a5022..c3e1ec962709fd843a63e5ac9222131605665e7d 100644 (file)
@@ -1448,7 +1448,9 @@ EVP_PKEY *EVP_PKEY_new(void)
 
     ret->type = EVP_PKEY_NONE;
     ret->save_type = EVP_PKEY_NONE;
-    ret->references = 1;
+
+    if (!CRYPTO_NEW_REF(&ret->references, 1))
+        goto err;
 
     ret->lock = CRYPTO_THREAD_lock_new();
     if (ret->lock == NULL) {
@@ -1466,6 +1468,7 @@ EVP_PKEY *EVP_PKEY_new(void)
     return ret;
 
  err:
+    CRYPTO_FREE_REF(&ret->references);
     CRYPTO_THREAD_lock_free(ret->lock);
     OPENSSL_free(ret);
     return NULL;
@@ -1655,7 +1658,7 @@ int EVP_PKEY_up_ref(EVP_PKEY *pkey)
 {
     int i;
 
-    if (CRYPTO_UP_REF(&pkey->references, &i, pkey->lock) <= 0)
+    if (CRYPTO_UP_REF(&pkey->references, &i) <= 0)
         return 0;
 
     REF_PRINT_COUNT("EVP_PKEY", pkey);
@@ -1778,7 +1781,7 @@ void EVP_PKEY_free(EVP_PKEY *x)
     if (x == NULL)
         return;
 
-    CRYPTO_DOWN_REF(&x->references, &i, x->lock);
+    CRYPTO_DOWN_REF(&x->references, &i);
     REF_PRINT_COUNT("EVP_PKEY", x);
     if (i > 0)
         return;
@@ -1788,6 +1791,7 @@ void EVP_PKEY_free(EVP_PKEY *x)
     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_EVP_PKEY, x, &x->ex_data);
 #endif
     CRYPTO_THREAD_lock_free(x->lock);
+    CRYPTO_FREE_REF(&x->references);
 #ifndef FIPS_MODULE
     sk_X509_ATTRIBUTE_pop_free(x->attributes, X509_ATTRIBUTE_free);
 #endif
index f035a422cac49b274573b7eca3dd83c078a908aa..0596a2b337c5ec60b44780a51143a61ca97b27f0 100644 (file)
@@ -25,15 +25,13 @@ static EVP_SIGNATURE *evp_signature_new(OSSL_PROVIDER *prov)
     if (signature == NULL)
         return NULL;
 
-    signature->lock = CRYPTO_THREAD_lock_new();
-    if (signature->lock == NULL) {
-        ERR_raise(ERR_LIB_EVP, ERR_R_CRYPTO_LIB);
+    if (!CRYPTO_NEW_REF(&signature->refcnt, 1)) {
         OPENSSL_free(signature);
         return NULL;
     }
+
     signature->prov = prov;
     ossl_provider_up_ref(prov);
-    signature->refcnt = 1;
 
     return signature;
 }
@@ -281,12 +279,12 @@ void EVP_SIGNATURE_free(EVP_SIGNATURE *signature)
 
     if (signature == NULL)
         return;
-    CRYPTO_DOWN_REF(&signature->refcnt, &i, signature->lock);
+    CRYPTO_DOWN_REF(&signature->refcnt, &i);
     if (i > 0)
         return;
     OPENSSL_free(signature->type_name);
     ossl_provider_free(signature->prov);
-    CRYPTO_THREAD_lock_free(signature->lock);
+    CRYPTO_FREE_REF(&signature->refcnt);
     OPENSSL_free(signature);
 }
 
@@ -294,7 +292,7 @@ int EVP_SIGNATURE_up_ref(EVP_SIGNATURE *signature)
 {
     int ref = 0;
 
-    CRYPTO_UP_REF(&signature->refcnt, &ref, signature->lock);
+    CRYPTO_UP_REF(&signature->refcnt, &ref);
     return 1;
 }
 
index 30c5aa2b1d30b643eb581011327f4028c8dec08a..76ccacfd8d210b3bf30c7c4c27b9363f7933058e 100644 (file)
@@ -204,7 +204,6 @@ struct evp_mac_st {
     const char *description;
 
     CRYPTO_REF_COUNT refcnt;
-    CRYPTO_RWLOCK *lock;
 
     OSSL_FUNC_mac_newctx_fn *newctx;
     OSSL_FUNC_mac_dupctx_fn *dupctx;
@@ -226,7 +225,6 @@ struct evp_kdf_st {
     char *type_name;
     const char *description;
     CRYPTO_REF_COUNT refcnt;
-    CRYPTO_RWLOCK *lock;
 
     OSSL_FUNC_kdf_newctx_fn *newctx;
     OSSL_FUNC_kdf_dupctx_fn *dupctx;
@@ -271,7 +269,6 @@ struct evp_md_st {
     const char *description;
     OSSL_PROVIDER *prov;
     CRYPTO_REF_COUNT refcnt;
-    CRYPTO_RWLOCK *lock;
     OSSL_FUNC_digest_newctx_fn *newctx;
     OSSL_FUNC_digest_init_fn *dinit;
     OSSL_FUNC_digest_update_fn *dupdate;
@@ -327,7 +324,6 @@ struct evp_cipher_st {
     const char *description;
     OSSL_PROVIDER *prov;
     CRYPTO_REF_COUNT refcnt;
-    CRYPTO_RWLOCK *lock;
     OSSL_FUNC_cipher_newctx_fn *newctx;
     OSSL_FUNC_cipher_encrypt_init_fn *einit;
     OSSL_FUNC_cipher_decrypt_init_fn *dinit;