Commit 47e9e36946 for openssl.org

commit 47e9e36946c069c437465ca6b389bfc0d00515dc
Author: Neil Horman <nhorman@openssl.org>
Date:   Fri May 8 10:30:16 2026 -0400

    Make EVP_KEYEXCH not do ref counting

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

diff --git a/crypto/evp/exchange.c b/crypto/evp/exchange.c
index 849bc21514..1d05f8e857 100644
--- a/crypto/evp/exchange.c
+++ b/crypto/evp/exchange.c
@@ -21,12 +21,27 @@

 static void evp_keyexch_free(void *data)
 {
-    EVP_KEYEXCH_free(data);
+    EVP_KEYEXCH *exchange = (EVP_KEYEXCH *)data;
+    int i;
+
+    if (exchange == NULL)
+        return;
+    CRYPTO_DOWN_REF(&exchange->refcnt, &i);
+    if (i > 0)
+        return;
+    OPENSSL_free(exchange->type_name);
+    ossl_provider_free(exchange->prov);
+    CRYPTO_FREE_REF(&exchange->refcnt);
+    OPENSSL_free(exchange);
 }

 static int evp_keyexch_up_ref(void *data)
 {
-    return EVP_KEYEXCH_up_ref(data);
+    EVP_KEYEXCH *exchange = (EVP_KEYEXCH *)data;
+    int ref = 0;
+
+    CRYPTO_UP_REF(&exchange->refcnt, &ref);
+    return 1;
 }

 static EVP_KEYEXCH *evp_keyexch_new(OSSL_PROVIDER *prov)
@@ -160,25 +175,18 @@ err:

 void EVP_KEYEXCH_free(EVP_KEYEXCH *exchange)
 {
-    int i;
-
-    if (exchange == NULL)
-        return;
-    CRYPTO_DOWN_REF(&exchange->refcnt, &i);
-    if (i > 0)
-        return;
-    OPENSSL_free(exchange->type_name);
-    ossl_provider_free(exchange->prov);
-    CRYPTO_FREE_REF(&exchange->refcnt);
-    OPENSSL_free(exchange);
+#ifdef OPENSSL_NO_CACHED_FETCH
+    evp_keyexch_free(exchange);
+#endif
 }

 int EVP_KEYEXCH_up_ref(EVP_KEYEXCH *exchange)
 {
-    int ref = 0;
-
-    CRYPTO_UP_REF(&exchange->refcnt, &ref);
+#ifdef OPENSSL_NO_CACHED_FETCH
+    return evp_keyexch_up_ref(exchange);
+#else
     return 1;
+#endif
 }

 OSSL_PROVIDER *EVP_KEYEXCH_get0_provider(const EVP_KEYEXCH *exchange)