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)