Commit 6d94352026 for openssl.org

commit 6d94352026ab4569dcc0ac7f65535e520dc34d75
Author: Neil Horman <nhorman@openssl.org>
Date:   Thu May 7 17:04:41 2026 -0400

    Make EVP_MD's not need to take reference counts

    Reviewed-by: Bob Beck <beck@openssl.org>
    Reviewed-by: Nikola Pajkovsky <nikolap@openssl.org>
    MergeDate: Thu Jun 25 21:25:47 2026
    (Merged from https://github.com/openssl/openssl/pull/31143)

diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c
index b6c01daeee..d18b707380 100644
--- a/crypto/evp/digest.c
+++ b/crypto/evp/digest.c
@@ -23,6 +23,8 @@

 #include <crypto/asn1.h>

+static void evp_md_free(void *m);
+
 void evp_md_ctx_clear_digest(EVP_MD_CTX *ctx, int force, int keep_fetched)
 {
     if (ctx->algctx != NULL) {
@@ -965,31 +967,13 @@ static void *evp_md_from_algorithm(int name_id,
     return md;

 err:
-    EVP_MD_free(md);
+    evp_md_free(md);
     return NULL;
 }

-static int evp_md_up_ref(void *md)
-{
-    return EVP_MD_up_ref(md);
-}
-
-static void evp_md_free(void *md)
-{
-    EVP_MD_free(md);
-}
-
-EVP_MD *EVP_MD_fetch(OSSL_LIB_CTX *ctx, const char *algorithm,
-    const char *properties)
-{
-    EVP_MD *md = evp_generic_fetch(ctx, OSSL_OP_DIGEST, algorithm, properties,
-        evp_md_from_algorithm, evp_md_up_ref, evp_md_free);
-
-    return md;
-}
-
-int EVP_MD_up_ref(EVP_MD *md)
+static int evp_md_up_ref(void *m)
 {
+    EVP_MD *md = (EVP_MD *)m;
     int ref = 0;

     if (md->origin == EVP_ORIG_DYNAMIC)
@@ -997,8 +981,9 @@ int EVP_MD_up_ref(EVP_MD *md)
     return 1;
 }

-void EVP_MD_free(EVP_MD *md)
+static void evp_md_free(void *m)
 {
+    EVP_MD *md = (EVP_MD *)m;
     int i;

     if (md == NULL || md->origin != EVP_ORIG_DYNAMIC)
@@ -1014,6 +999,33 @@ void EVP_MD_free(EVP_MD *md)
     OPENSSL_free(md);
 }

+EVP_MD *EVP_MD_fetch(OSSL_LIB_CTX *ctx, const char *algorithm,
+    const char *properties)
+{
+    EVP_MD *md = evp_generic_fetch(ctx, OSSL_OP_DIGEST, algorithm, properties,
+        evp_md_from_algorithm, evp_md_up_ref, evp_md_free);
+
+    return md;
+}
+
+int EVP_MD_up_ref(EVP_MD *md)
+{
+#ifdef OPENSSL_NO_CACHED_FETCH
+    return evp_md_up_ref(md);
+#else
+    return 1;
+#endif
+}
+
+void EVP_MD_free(EVP_MD *md)
+{
+#ifdef OPENSSL_NO_CACHED_FETCH
+    evp_md_free(md);
+#else
+    return;
+#endif
+}
+
 void EVP_MD_do_all_provided(OSSL_LIB_CTX *libctx,
     void (*fn)(EVP_MD *mac, void *arg),
     void *arg)