Commit 2480844a11 for openssl.org

commit 2480844a113268b602e43adc48fe27a0b88a9a5c
Author: Neil Horman <nhorman@openssl.org>
Date:   Fri May 8 10:40:33 2026 -0400

    Make OSSL_ENCODER not do ref counting

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

diff --git a/crypto/encode_decode/decoder_meth.c b/crypto/encode_decode/decoder_meth.c
index 4d460af1c2..b38f1adf5b 100644
--- a/crypto/encode_decode/decoder_meth.c
+++ b/crypto/encode_decode/decoder_meth.c
@@ -26,12 +26,29 @@

 static void ossl_decoder_free(void *data)
 {
-    OSSL_DECODER_free(data);
+    OSSL_DECODER *decoder = (OSSL_DECODER *)data;
+    int ref = 0;
+
+    if (decoder == NULL)
+        return;
+
+    CRYPTO_DOWN_REF(&decoder->base.refcnt, &ref);
+    if (ref > 0)
+        return;
+    OPENSSL_free(decoder->base.name);
+    ossl_property_free(decoder->base.parsed_propdef);
+    ossl_provider_free(decoder->base.prov);
+    CRYPTO_FREE_REF(&decoder->base.refcnt);
+    OPENSSL_free(decoder);
 }

 static int ossl_decoder_up_ref(void *data)
 {
-    return OSSL_DECODER_up_ref(data);
+    OSSL_DECODER *decoder = (OSSL_DECODER *)data;
+    int ref = 0;
+
+    CRYPTO_UP_REF(&decoder->base.refcnt, &ref);
+    return 1;
 }

 /* Simple method structure constructor and destructor */
@@ -51,27 +68,23 @@ static OSSL_DECODER *ossl_decoder_new(void)

 int OSSL_DECODER_up_ref(OSSL_DECODER *decoder)
 {
-    int ref = 0;
-
-    CRYPTO_UP_REF(&decoder->base.refcnt, &ref);
+#ifdef OSSL_DECODER_fetch
+    return ossl_decoder_up_ref(decoder);
+#else
+    if (decoder->base.id == 0)
+        return ossl_decoder_up_ref(decoder);
     return 1;
+#endif
 }

 void OSSL_DECODER_free(OSSL_DECODER *decoder)
 {
-    int ref = 0;
-
-    if (decoder == NULL)
-        return;
-
-    CRYPTO_DOWN_REF(&decoder->base.refcnt, &ref);
-    if (ref > 0)
-        return;
-    OPENSSL_free(decoder->base.name);
-    ossl_property_free(decoder->base.parsed_propdef);
-    ossl_provider_free(decoder->base.prov);
-    CRYPTO_FREE_REF(&decoder->base.refcnt);
-    OPENSSL_free(decoder);
+#ifdef OSSL_DECODER_fetch
+    ossl_decoder_free(decoder);
+#else
+    if (decoder != NULL && decoder->base.id == 0)
+        ossl_decoder_free(decoder);
+#endif
 }

 /* Data to be passed through ossl_method_construct() */
diff --git a/crypto/encode_decode/encoder_meth.c b/crypto/encode_decode/encoder_meth.c
index 74ba83fc3d..0c9647e51f 100644
--- a/crypto/encode_decode/encoder_meth.c
+++ b/crypto/encode_decode/encoder_meth.c
@@ -52,27 +52,17 @@ static OSSL_ENCODER *ossl_encoder_new(void)

 int OSSL_ENCODER_up_ref(OSSL_ENCODER *encoder)
 {
-    int ref = 0;
-
-    CRYPTO_UP_REF(&encoder->base.refcnt, &ref);
+#ifdef OPENSSL_NO_CACHED_FETCH
+    return ossl_encoder_up_ref(encoder);
+#else
     return 1;
 }

 void OSSL_ENCODER_free(OSSL_ENCODER *encoder)
 {
-    int ref = 0;
-
-    if (encoder == NULL)
-        return;
-
-    CRYPTO_DOWN_REF(&encoder->base.refcnt, &ref);
-    if (ref > 0)
-        return;
-    OPENSSL_free(encoder->base.name);
-    ossl_property_free(encoder->base.parsed_propdef);
-    ossl_provider_free(encoder->base.prov);
-    CRYPTO_FREE_REF(&encoder->base.refcnt);
-    OPENSSL_free(encoder);
+#ifdef OPENSSL_NO_CACHED_FETCH
+    ossl_encoder_free(encoder);
+#endif
 }

 /* Data to be passed through ossl_method_construct() */