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() */