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)