Commit 32f23d770e for openssl.org
commit 32f23d770eeee87ba4657c2b9a551c28949cc5b4
Author: Neil Horman <nhorman@openssl.org>
Date: Fri May 8 10:23:00 2026 -0400
Make EVP_KEYMGMT not do ref counting
Reviewed-by: Bob Beck <beck@openssl.org>
Reviewed-by: Nikola Pajkovsky <nikolap@openssl.org>
MergeDate: Thu Jun 25 21:26:04 2026
(Merged from https://github.com/openssl/openssl/pull/31143)
diff --git a/crypto/evp/keymgmt_meth.c b/crypto/evp/keymgmt_meth.c
index e7f00d091f..a84c634441 100644
--- a/crypto/evp/keymgmt_meth.c
+++ b/crypto/evp/keymgmt_meth.c
@@ -19,12 +19,28 @@
static void evp_keymgmt_free(void *data)
{
- EVP_KEYMGMT_free(data);
+ EVP_KEYMGMT *keymgmt = (EVP_KEYMGMT *)data;
+ int ref = 0;
+
+ if (keymgmt == NULL)
+ return;
+
+ CRYPTO_DOWN_REF(&keymgmt->refcnt, &ref);
+ if (ref > 0)
+ return;
+ OPENSSL_free(keymgmt->type_name);
+ ossl_provider_free(keymgmt->prov);
+ CRYPTO_FREE_REF(&keymgmt->refcnt);
+ OPENSSL_free(keymgmt);
}
static int evp_keymgmt_up_ref(void *data)
{
- return EVP_KEYMGMT_up_ref(data);
+ EVP_KEYMGMT *keymgmt = (EVP_KEYMGMT *)data;
+ int ref = 0;
+
+ CRYPTO_UP_REF(&keymgmt->refcnt, &ref);
+ return 1;
}
static void *keymgmt_new(void)
@@ -293,26 +309,18 @@ EVP_KEYMGMT *EVP_KEYMGMT_fetch(OSSL_LIB_CTX *ctx, const char *algorithm,
int EVP_KEYMGMT_up_ref(EVP_KEYMGMT *keymgmt)
{
- int ref = 0;
-
- CRYPTO_UP_REF(&keymgmt->refcnt, &ref);
+#ifdef OPENSSL_NO_CACHED_FETCH
+ return evp_keymgmt_up_ref(keymgmt);
+#else
return 1;
+#endif
}
void EVP_KEYMGMT_free(EVP_KEYMGMT *keymgmt)
{
- int ref = 0;
-
- if (keymgmt == NULL)
- return;
-
- CRYPTO_DOWN_REF(&keymgmt->refcnt, &ref);
- if (ref > 0)
- return;
- OPENSSL_free(keymgmt->type_name);
- ossl_provider_free(keymgmt->prov);
- CRYPTO_FREE_REF(&keymgmt->refcnt);
- OPENSSL_free(keymgmt);
+#ifdef OPENSSL_NO_CACHED_FETCH
+ evp_keymgmt_free(keymgmt);
+#endif
}
const OSSL_PROVIDER *EVP_KEYMGMT_get0_provider(const EVP_KEYMGMT *keymgmt)