Commit ae23b9ae02 for openssl.org
commit ae23b9ae022b6399fe337b0378cc63bab9b509d4
Author: Neil Horman <nhorman@openssl.org>
Date: Thu May 7 17:16:40 2026 -0400
Make SKEYMGMT not do ref counting
Reviewed-by: Bob Beck <beck@openssl.org>
Reviewed-by: Nikola Pajkovsky <nikolap@openssl.org>
MergeDate: Thu Jun 25 21:25:51 2026
(Merged from https://github.com/openssl/openssl/pull/31143)
diff --git a/crypto/evp/skeymgmt_meth.c b/crypto/evp/skeymgmt_meth.c
index 75c4fef675..88f0a6a133 100644
--- a/crypto/evp/skeymgmt_meth.c
+++ b/crypto/evp/skeymgmt_meth.c
@@ -17,6 +17,8 @@
#include "crypto/evp.h"
#include "evp_local.h"
+static void evp_skeymgmt_free(void *s);
+
void *evp_skeymgmt_generate(const EVP_SKEYMGMT *skeymgmt, const OSSL_PARAM params[])
{
void *provctx = ossl_provider_ctx(EVP_SKEYMGMT_get0_provider(skeymgmt));
@@ -45,16 +47,6 @@ void evp_skeymgmt_freedata(const EVP_SKEYMGMT *skeymgmt, void *keydata)
skeymgmt->free(keydata);
}
-static int evp_skeymgmt_up_ref(void *skeymgmt)
-{
- return EVP_SKEYMGMT_up_ref(skeymgmt);
-}
-
-static void evp_skeymgmt_free(void *skeymgmt)
-{
- EVP_SKEYMGMT_free(skeymgmt);
-}
-
static void *skeymgmt_new(void)
{
EVP_SKEYMGMT *skeymgmt = NULL;
@@ -62,7 +54,7 @@ static void *skeymgmt_new(void)
if ((skeymgmt = OPENSSL_zalloc(sizeof(*skeymgmt))) == NULL)
return NULL;
if (!CRYPTO_NEW_REF(&skeymgmt->refcnt, 1)) {
- EVP_SKEYMGMT_free(skeymgmt);
+ evp_skeymgmt_free(skeymgmt);
return NULL;
}
return skeymgmt;
@@ -80,7 +72,7 @@ static void *skeymgmt_from_algorithm(int name_id,
skeymgmt->name_id = name_id;
if ((skeymgmt->type_name = ossl_algorithm_get1_first_name(algodef)) == NULL) {
- EVP_SKEYMGMT_free(skeymgmt);
+ evp_skeymgmt_free(skeymgmt);
return NULL;
}
skeymgmt->description = algodef->algorithm_description;
@@ -122,13 +114,13 @@ static void *skeymgmt_from_algorithm(int name_id,
if (skeymgmt->free == NULL
|| skeymgmt->import == NULL
|| skeymgmt->export == NULL) {
- EVP_SKEYMGMT_free(skeymgmt);
+ evp_skeymgmt_free(skeymgmt);
ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS);
return NULL;
}
if (!ossl_provider_up_ref(prov)) {
- EVP_SKEYMGMT_free(skeymgmt);
+ evp_skeymgmt_free(skeymgmt);
ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
return NULL;
}
@@ -137,6 +129,32 @@ static void *skeymgmt_from_algorithm(int name_id,
return skeymgmt;
}
+static int evp_skeymgmt_up_ref(void *s)
+{
+ EVP_SKEYMGMT *skeymgmt = (EVP_SKEYMGMT *)s;
+ int ref = 0;
+
+ CRYPTO_UP_REF(&skeymgmt->refcnt, &ref);
+ return 1;
+}
+
+static void evp_skeymgmt_free(void *s)
+{
+ EVP_SKEYMGMT *skeymgmt = (EVP_SKEYMGMT *)s;
+ int ref = 0;
+
+ if (skeymgmt == NULL)
+ return;
+
+ CRYPTO_DOWN_REF(&skeymgmt->refcnt, &ref);
+ if (ref > 0)
+ return;
+ OPENSSL_free(skeymgmt->type_name);
+ ossl_provider_free(skeymgmt->prov);
+ CRYPTO_FREE_REF(&skeymgmt->refcnt);
+ OPENSSL_free(skeymgmt);
+}
+
EVP_SKEYMGMT *evp_skeymgmt_fetch_from_prov(OSSL_PROVIDER *prov,
const char *name,
const char *properties)
@@ -160,26 +178,18 @@ EVP_SKEYMGMT *EVP_SKEYMGMT_fetch(OSSL_LIB_CTX *ctx, const char *algorithm,
int EVP_SKEYMGMT_up_ref(EVP_SKEYMGMT *skeymgmt)
{
- int ref = 0;
-
- CRYPTO_UP_REF(&skeymgmt->refcnt, &ref);
+#ifdef OPENSSL_NO_CACHED_FETCH
+ return evp_skeymgmt_up_ref(skeymgmt);
+#else
return 1;
+#endif
}
void EVP_SKEYMGMT_free(EVP_SKEYMGMT *skeymgmt)
{
- int ref = 0;
-
- if (skeymgmt == NULL)
- return;
-
- CRYPTO_DOWN_REF(&skeymgmt->refcnt, &ref);
- if (ref > 0)
- return;
- OPENSSL_free(skeymgmt->type_name);
- ossl_provider_free(skeymgmt->prov);
- CRYPTO_FREE_REF(&skeymgmt->refcnt);
- OPENSSL_free(skeymgmt);
+#ifdef OPENSSL_NO_CACHED_FETCH
+ evp_skeymgmt_free(skeymgmt);
+#endif
}
const OSSL_PROVIDER *EVP_SKEYMGMT_get0_provider(const EVP_SKEYMGMT *skeymgmt)