Commit 437e09afb1 for openssl.org

commit 437e09afb1f3dd8d8f888ecca9aaf7cb53ae7c60
Author: Frederik Wedel-Heinen <frederik.wedel-heinen@dencrypt.dk>
Date:   Sat Jun 27 07:11:14 2026 +0200

    Make sure we always check return of CRYPTO_UP_REF which can fail.

    Reviewed-by: Kurt Roeckx <kurt@roeckx.be>
    Reviewed-by: Paul Dale <paul.dale@oracle.com>
    MergeDate: Mon Jul 20 11:13:58 2026
    (Merged from https://github.com/openssl/openssl/pull/31753)

diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c
index dbd55c8b2f..6066cc0d8c 100644
--- a/crypto/bio/bio_lib.c
+++ b/crypto/bio/bio_lib.c
@@ -193,7 +193,7 @@ int BIO_up_ref(BIO *a)
 {
     int i;

-    if (CRYPTO_UP_REF(&a->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&a->references, &i))
         return 0;

     REF_PRINT_COUNT("BIO", i, a);
diff --git a/crypto/dh/dh_lib.c b/crypto/dh/dh_lib.c
index 27ca94d1a6..1934c71080 100644
--- a/crypto/dh/dh_lib.c
+++ b/crypto/dh/dh_lib.c
@@ -142,7 +142,7 @@ int DH_up_ref(DH *r)
 {
     int i;

-    if (CRYPTO_UP_REF(&r->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&r->references, &i))
         return 0;

     REF_PRINT_COUNT("DH", i, r);
diff --git a/crypto/dsa/dsa_lib.c b/crypto/dsa/dsa_lib.c
index 834d271346..5936b84098 100644
--- a/crypto/dsa/dsa_lib.c
+++ b/crypto/dsa/dsa_lib.c
@@ -215,7 +215,7 @@ int DSA_up_ref(DSA *r)
 {
     int i;

-    if (CRYPTO_UP_REF(&r->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&r->references, &i))
         return 0;

     REF_PRINT_COUNT("DSA", i, r);
diff --git a/crypto/dso/dso_lib.c b/crypto/dso/dso_lib.c
index 6f51e4d35a..1366bea66d 100644
--- a/crypto/dso/dso_lib.c
+++ b/crypto/dso/dso_lib.c
@@ -93,7 +93,7 @@ int DSO_up_ref(DSO *dso)
         return 0;
     }

-    if (CRYPTO_UP_REF(&dso->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&dso->references, &i))
         return 0;

     REF_PRINT_COUNT("DSO", i, dso);
diff --git a/crypto/ec/ec_key.c b/crypto/ec/ec_key.c
index 44791a2c3e..4a84933bb6 100644
--- a/crypto/ec/ec_key.c
+++ b/crypto/ec/ec_key.c
@@ -175,7 +175,7 @@ int EC_KEY_up_ref(EC_KEY *r)
 {
     int i;

-    if (CRYPTO_UP_REF(&r->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&r->references, &i))
         return 0;

     REF_PRINT_COUNT("EC_KEY", i, r);
diff --git a/crypto/ec/ec_mult.c b/crypto/ec/ec_mult.c
index 4771789151..f5c6ac7893 100644
--- a/crypto/ec/ec_mult.c
+++ b/crypto/ec/ec_mult.c
@@ -72,8 +72,8 @@ static EC_PRE_COMP *ec_pre_comp_new(const EC_GROUP *group)
 EC_PRE_COMP *EC_ec_pre_comp_dup(EC_PRE_COMP *pre)
 {
     int i;
-    if (pre != NULL)
-        CRYPTO_UP_REF(&pre->references, &i);
+    if (pre == NULL || !CRYPTO_UP_REF(&pre->references, &i))
+        return NULL;
     return pre;
 }

diff --git a/crypto/ec/ecp_nistp224.c b/crypto/ec/ecp_nistp224.c
index 7183131622..1a0952083c 100644
--- a/crypto/ec/ecp_nistp224.c
+++ b/crypto/ec/ecp_nistp224.c
@@ -1234,8 +1234,8 @@ static NISTP224_PRE_COMP *nistp224_pre_comp_new(void)
 NISTP224_PRE_COMP *EC_nistp224_pre_comp_dup(NISTP224_PRE_COMP *p)
 {
     int i;
-    if (p != NULL)
-        CRYPTO_UP_REF(&p->references, &i);
+    if (p == NULL || !CRYPTO_UP_REF(&p->references, &i))
+        return NULL;
     return p;
 }

diff --git a/crypto/ec/ecp_nistp256.c b/crypto/ec/ecp_nistp256.c
index e247e51c9c..fba197a8c7 100644
--- a/crypto/ec/ecp_nistp256.c
+++ b/crypto/ec/ecp_nistp256.c
@@ -1852,8 +1852,8 @@ static NISTP256_PRE_COMP *nistp256_pre_comp_new(void)
 NISTP256_PRE_COMP *EC_nistp256_pre_comp_dup(NISTP256_PRE_COMP *p)
 {
     int i;
-    if (p != NULL)
-        CRYPTO_UP_REF(&p->references, &i);
+    if (p == NULL || !CRYPTO_UP_REF(&p->references, &i))
+        return NULL;
     return p;
 }

diff --git a/crypto/ec/ecp_nistp384.c b/crypto/ec/ecp_nistp384.c
index e03bda2178..3d212dcc15 100644
--- a/crypto/ec/ecp_nistp384.c
+++ b/crypto/ec/ecp_nistp384.c
@@ -1576,8 +1576,8 @@ NISTP384_PRE_COMP *ossl_ec_nistp384_pre_comp_dup(NISTP384_PRE_COMP *p)
 {
     int i;

-    if (p != NULL)
-        CRYPTO_UP_REF(&p->references, &i);
+    if (p == NULL || !CRYPTO_UP_REF(&p->references, &i))
+        return NULL;
     return p;
 }

diff --git a/crypto/ec/ecp_nistp521.c b/crypto/ec/ecp_nistp521.c
index 7ea8d00c14..f7315f136c 100644
--- a/crypto/ec/ecp_nistp521.c
+++ b/crypto/ec/ecp_nistp521.c
@@ -1667,8 +1667,8 @@ static NISTP521_PRE_COMP *nistp521_pre_comp_new(void)
 NISTP521_PRE_COMP *EC_nistp521_pre_comp_dup(NISTP521_PRE_COMP *p)
 {
     int i;
-    if (p != NULL)
-        CRYPTO_UP_REF(&p->references, &i);
+    if (p == NULL || !CRYPTO_UP_REF(&p->references, &i))
+        return NULL;
     return p;
 }

diff --git a/crypto/ec/ecp_nistz256.c b/crypto/ec/ecp_nistz256.c
index 301f90188a..df467b948f 100644
--- a/crypto/ec/ecp_nistz256.c
+++ b/crypto/ec/ecp_nistz256.c
@@ -1208,8 +1208,8 @@ static NISTZ256_PRE_COMP *ecp_nistz256_pre_comp_new(const EC_GROUP *group)
 NISTZ256_PRE_COMP *EC_nistz256_pre_comp_dup(NISTZ256_PRE_COMP *p)
 {
     int i;
-    if (p != NULL)
-        CRYPTO_UP_REF(&p->references, &i);
+    if (p == NULL || !CRYPTO_UP_REF(&p->references, &i))
+        return NULL;
     return p;
 }

diff --git a/crypto/ec/ecx_key.c b/crypto/ec/ecx_key.c
index 4d8c945755..036e308e8b 100644
--- a/crypto/ec/ecx_key.c
+++ b/crypto/ec/ecx_key.c
@@ -92,7 +92,7 @@ int ossl_ecx_key_up_ref(ECX_KEY *key)
 {
     int i;

-    if (CRYPTO_UP_REF(&key->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&key->references, &i))
         return 0;

     REF_PRINT_COUNT("ECX_KEY", i, key);
diff --git a/crypto/encode_decode/decoder_meth.c b/crypto/encode_decode/decoder_meth.c
index 772c29c031..03118f5843 100644
--- a/crypto/encode_decode/decoder_meth.c
+++ b/crypto/encode_decode/decoder_meth.c
@@ -47,8 +47,7 @@ static int ossl_decoder_up_ref(void *data)
     OSSL_DECODER *decoder = (OSSL_DECODER *)data;
     int ref = 0;

-    CRYPTO_UP_REF(&decoder->base.refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&decoder->base.refcnt, &ref);
 }

 /* Simple method structure constructor and destructor */
diff --git a/crypto/encode_decode/encoder_meth.c b/crypto/encode_decode/encoder_meth.c
index 23dcccebb9..cb167004ab 100644
--- a/crypto/encode_decode/encoder_meth.c
+++ b/crypto/encode_decode/encoder_meth.c
@@ -48,8 +48,7 @@ static int ossl_encoder_up_ref(void *data)
     OSSL_ENCODER *encoder = (OSSL_ENCODER *)data;
     int ref = 0;

-    CRYPTO_UP_REF(&encoder->base.refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&encoder->base.refcnt, &ref);
 }

 /* Simple method structure constructor and destructor */
diff --git a/crypto/evp/asymcipher.c b/crypto/evp/asymcipher.c
index 1665efd3e2..ec643bec9e 100644
--- a/crypto/evp/asymcipher.c
+++ b/crypto/evp/asymcipher.c
@@ -38,8 +38,7 @@ static int evp_asym_cipher_up_ref(void *data)
     EVP_ASYM_CIPHER *cipher = (EVP_ASYM_CIPHER *)data;
     int ref = 0;

-    CRYPTO_UP_REF(&cipher->refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&cipher->refcnt, &ref);
 }

 static int evp_pkey_asym_cipher_init(EVP_PKEY_CTX *ctx, int operation,
diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c
index 61e7dbc4ec..db7121f0a4 100644
--- a/crypto/evp/digest.c
+++ b/crypto/evp/digest.c
@@ -981,7 +981,7 @@ static int evp_md_up_ref(void *m)
     int ref = 0;

     if (md->origin == EVP_ORIG_DYNAMIC)
-        CRYPTO_UP_REF(&md->refcnt, &ref);
+        return CRYPTO_UP_REF(&md->refcnt, &ref);
     return 1;
 }

diff --git a/crypto/evp/evp_enc.c b/crypto/evp/evp_enc.c
index 830cfdb8d8..a5c513db0d 100644
--- a/crypto/evp/evp_enc.c
+++ b/crypto/evp/evp_enc.c
@@ -1346,7 +1346,7 @@ static int evp_cipher_up_ref(void *c)
     int ref = 0;

     if (cipher->origin == EVP_ORIG_DYNAMIC)
-        CRYPTO_UP_REF(&cipher->refcnt, &ref);
+        return CRYPTO_UP_REF(&cipher->refcnt, &ref);
     return 1;
 }

diff --git a/crypto/evp/exchange.c b/crypto/evp/exchange.c
index 83fcbeb104..8718726076 100644
--- a/crypto/evp/exchange.c
+++ b/crypto/evp/exchange.c
@@ -40,8 +40,7 @@ static int evp_keyexch_up_ref(void *data)
     EVP_KEYEXCH *exchange = (EVP_KEYEXCH *)data;
     int ref = 0;

-    CRYPTO_UP_REF(&exchange->refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&exchange->refcnt, &ref);
 }

 static EVP_KEYEXCH *evp_keyexch_new(OSSL_PROVIDER *prov)
diff --git a/crypto/evp/kdf_meth.c b/crypto/evp/kdf_meth.c
index e0741450e9..c6df2971db 100644
--- a/crypto/evp/kdf_meth.c
+++ b/crypto/evp/kdf_meth.c
@@ -22,8 +22,7 @@ static int evp_kdf_up_ref(void *vkdf)
     EVP_KDF *kdf = (EVP_KDF *)vkdf;
     int ref = 0;

-    CRYPTO_UP_REF(&kdf->refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&kdf->refcnt, &ref);
 }

 static void evp_kdf_free(void *vkdf)
diff --git a/crypto/evp/kem.c b/crypto/evp/kem.c
index 4041390106..8ae968d5a5 100644
--- a/crypto/evp/kem.c
+++ b/crypto/evp/kem.c
@@ -39,8 +39,7 @@ static int evp_kem_up_ref(void *data)
     EVP_KEM *kem = (EVP_KEM *)data;
     int ref = 0;

-    CRYPTO_UP_REF(&kem->refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&kem->refcnt, &ref);
 }

 static int evp_kem_init(EVP_PKEY_CTX *ctx, int operation,
diff --git a/crypto/evp/keymgmt_meth.c b/crypto/evp/keymgmt_meth.c
index 07ea8f8b9e..9cf4ef5e4f 100644
--- a/crypto/evp/keymgmt_meth.c
+++ b/crypto/evp/keymgmt_meth.c
@@ -39,8 +39,7 @@ static int evp_keymgmt_up_ref(void *data)
     EVP_KEYMGMT *keymgmt = (EVP_KEYMGMT *)data;
     int ref = 0;

-    CRYPTO_UP_REF(&keymgmt->refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&keymgmt->refcnt, &ref);
 }

 static void *keymgmt_new(void)
diff --git a/crypto/evp/mac_meth.c b/crypto/evp/mac_meth.c
index 62d94de45c..2a6fb0abe5 100644
--- a/crypto/evp/mac_meth.c
+++ b/crypto/evp/mac_meth.c
@@ -21,8 +21,7 @@ static int evp_mac_up_ref(void *vmac)
     EVP_MAC *mac = vmac;
     int ref = 0;

-    CRYPTO_UP_REF(&mac->refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&mac->refcnt, &ref);
 }

 static void evp_mac_free(void *vmac)
diff --git a/crypto/evp/p_lib.c b/crypto/evp/p_lib.c
index 2895db09a7..f13390b54e 100644
--- a/crypto/evp/p_lib.c
+++ b/crypto/evp/p_lib.c
@@ -1630,7 +1630,7 @@ int EVP_PKEY_up_ref(EVP_PKEY *pkey)
 {
     int i;

-    if (CRYPTO_UP_REF(&pkey->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&pkey->references, &i))
         return 0;

     REF_PRINT_COUNT("EVP_PKEY", i, pkey);
diff --git a/crypto/evp/s_lib.c b/crypto/evp/s_lib.c
index 5594dc81c5..3f76136324 100644
--- a/crypto/evp/s_lib.c
+++ b/crypto/evp/s_lib.c
@@ -196,7 +196,7 @@ int EVP_SKEY_up_ref(EVP_SKEY *skey)
 {
     int i;

-    if (CRYPTO_UP_REF(&skey->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&skey->references, &i))
         return 0;

     REF_PRINT_COUNT("EVP_SKEY", i, skey);
diff --git a/crypto/evp/signature.c b/crypto/evp/signature.c
index f2e405aaa3..6c6aad7e92 100644
--- a/crypto/evp/signature.c
+++ b/crypto/evp/signature.c
@@ -41,8 +41,7 @@ static int evp_signature_up_ref(void *data)
     EVP_SIGNATURE *signature = (EVP_SIGNATURE *)data;
     int ref = 0;

-    CRYPTO_UP_REF(&signature->refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&signature->refcnt, &ref);
 }

 static EVP_SIGNATURE *evp_signature_new(OSSL_PROVIDER *prov)
diff --git a/crypto/evp/skeymgmt_meth.c b/crypto/evp/skeymgmt_meth.c
index d1e5c9d446..dbc14c0e0d 100644
--- a/crypto/evp/skeymgmt_meth.c
+++ b/crypto/evp/skeymgmt_meth.c
@@ -135,8 +135,7 @@ static int evp_skeymgmt_up_ref(void *s)
     EVP_SKEYMGMT *skeymgmt = (EVP_SKEYMGMT *)s;
     int ref = 0;

-    CRYPTO_UP_REF(&skeymgmt->refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&skeymgmt->refcnt, &ref);
 }

 static void evp_skeymgmt_free(void *s)
diff --git a/crypto/provider_core.c b/crypto/provider_core.c
index b408e95e10..93732995be 100644
--- a/crypto/provider_core.c
+++ b/crypto/provider_core.c
@@ -486,7 +486,7 @@ int ossl_provider_up_ref(OSSL_PROVIDER *prov)
 {
     int ref = 0;

-    if (CRYPTO_UP_REF(&prov->refcnt, &ref) <= 0)
+    if (!CRYPTO_UP_REF(&prov->refcnt, &ref))
         return 0;

 #ifndef FIPS_MODULE
@@ -1576,7 +1576,7 @@ int ossl_provider_doall_activated(OSSL_LIB_CTX *ctx,
              * to avoid upping the ref count on the parent provider, which we
              * must not do while holding locks.
              */
-            if (CRYPTO_UP_REF(&prov->refcnt, &ref) <= 0) {
+            if (!CRYPTO_UP_REF(&prov->refcnt, &ref)) {
                 CRYPTO_THREAD_unlock(prov->flag_lock);
                 goto err_unlock;
             }
diff --git a/crypto/rsa/rsa_lib.c b/crypto/rsa/rsa_lib.c
index a7d5798c88..88a7a2b93f 100644
--- a/crypto/rsa/rsa_lib.c
+++ b/crypto/rsa/rsa_lib.c
@@ -163,7 +163,7 @@ int RSA_up_ref(RSA *r)
 {
     int i;

-    if (CRYPTO_UP_REF(&r->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&r->references, &i))
         return 0;

     REF_PRINT_COUNT("RSA", i, r);
diff --git a/crypto/store/store_meth.c b/crypto/store/store_meth.c
index 976e4aa734..1d54d89978 100644
--- a/crypto/store/store_meth.c
+++ b/crypto/store/store_meth.c
@@ -22,7 +22,7 @@ static int up_ref_loader(void *method)
     int ref = 0;

     if (loader->prov != NULL)
-        CRYPTO_UP_REF(&loader->refcnt, &ref);
+        return CRYPTO_UP_REF(&loader->refcnt, &ref);
     return 1;
 }

diff --git a/crypto/x509/x509_lu.c b/crypto/x509/x509_lu.c
index d1f4c1eb40..5be50c2195 100644
--- a/crypto/x509/x509_lu.c
+++ b/crypto/x509/x509_lu.c
@@ -287,7 +287,7 @@ int X509_STORE_up_ref(X509_STORE *xs)
 {
     int i;

-    if (CRYPTO_UP_REF(&xs->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&xs->references, &i))
         return 0;

     REF_PRINT_COUNT("X509_STORE", i, xs);
diff --git a/crypto/x509/x509_set.c b/crypto/x509/x509_set.c
index 8a2a12e4b6..11439bcafb 100644
--- a/crypto/x509/x509_set.c
+++ b/crypto/x509/x509_set.c
@@ -117,7 +117,7 @@ int X509_up_ref(X509 *x)
 {
     int i;

-    if (CRYPTO_UP_REF(&x->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&x->references, &i))
         return 0;

     REF_PRINT_COUNT("X509", i, x);
diff --git a/crypto/x509/x509cset.c b/crypto/x509/x509cset.c
index 20de6a340e..ec3e1f5360 100644
--- a/crypto/x509/x509cset.c
+++ b/crypto/x509/x509cset.c
@@ -75,7 +75,7 @@ int X509_CRL_up_ref(X509_CRL *crl)
 {
     int i;

-    if (CRYPTO_UP_REF(&crl->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&crl->references, &i))
         return 0;

     REF_PRINT_COUNT("X509_CRL", i, crl);
diff --git a/doc/internal/man3/evp_generic_fetch.pod b/doc/internal/man3/evp_generic_fetch.pod
index 016494239e..53f29c1e98 100644
--- a/doc/internal/man3/evp_generic_fetch.pod
+++ b/doc/internal/man3/evp_generic_fetch.pod
@@ -187,8 +187,7 @@ And here's the implementation of the FOO method fetcher:
         EVP_FOO *foo = vfoo;
         int ref = 0;

-        CRYPTO_UP_REF(&foo->refcnt, &ref);
-        return 1;
+        return CRYPTO_UP_REF(&foo->refcnt, &ref);
     }

     static void foo_free(void *vfoo)
diff --git a/include/internal/refcount.h b/include/internal/refcount.h
index 2e7dedf2c3..8bbb11e3fc 100644
--- a/include/internal/refcount.h
+++ b/include/internal/refcount.h
@@ -14,6 +14,8 @@
 #include <openssl/trace.h>
 #include <openssl/err.h>

+#include <stdbool.h>
+
 #if defined(OPENSSL_THREADS) && !defined(OPENSSL_DEV_NO_ATOMICS)
 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L \
     && !defined(__STDC_NO_ATOMICS__)
@@ -36,10 +38,10 @@ typedef struct {
     _Atomic int val;
 } CRYPTO_REF_COUNT;

-static inline int CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
+static inline bool CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
 {
     *ret = atomic_fetch_add_explicit(&refcnt->val, 1, memory_order_relaxed) + 1;
-    return 1;
+    return true;
 }

 /*
@@ -76,10 +78,10 @@ typedef struct {
     int val;
 } CRYPTO_REF_COUNT;

-static __inline__ int CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
+static __inline__ bool CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
 {
     *ret = __atomic_fetch_add(&refcnt->val, 1, __ATOMIC_RELAXED) + 1;
-    return 1;
+    return true;
 }

 static __inline__ int CRYPTO_DOWN_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
@@ -97,10 +99,10 @@ typedef struct {
     volatile int val;
 } CRYPTO_REF_COUNT;

-static __inline int CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
+static __inline bool CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
 {
     *ret = _InterlockedExchangeAdd((void *)&refcnt->val, 1) + 1;
-    return 1;
+    return true;
 }

 static __inline int CRYPTO_DOWN_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
@@ -123,10 +125,10 @@ typedef struct {
 #define _ARM_BARRIER_ISH _ARM64_BARRIER_ISH
 #endif

-static __inline int CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
+static __inline bool CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
 {
     *ret = _InterlockedExchangeAdd_nf(&refcnt->val, 1) + 1;
-    return 1;
+    return true;
 }

 static __inline int CRYPTO_DOWN_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
@@ -138,10 +140,10 @@ static __inline int CRYPTO_DOWN_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
 #else
 #pragma intrinsic(_InterlockedExchangeAdd)

-static __inline int CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
+static __inline bool CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
 {
     *ret = _InterlockedExchangeAdd(&refcnt->val, 1) + 1;
-    return 1;
+    return true;
 }

 static __inline int CRYPTO_DOWN_REF(CRYPTO_REF_COUNT *refcnt, int *ret)
@@ -171,10 +173,10 @@ typedef struct {

 #ifdef OPENSSL_THREADS

-static ossl_unused ossl_inline int CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt,
+static ossl_unused ossl_inline bool CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt,
     int *ret)
 {
-    return CRYPTO_atomic_add(&refcnt->val, 1, ret, refcnt->lock);
+    return CRYPTO_atomic_add(&refcnt->val, 1, ret, refcnt->lock) ? true : false;
 }

 static ossl_unused ossl_inline int CRYPTO_DOWN_REF(CRYPTO_REF_COUNT *refcnt,
@@ -203,12 +205,12 @@ static ossl_unused ossl_inline void CRYPTO_FREE_REF(CRYPTO_REF_COUNT *refcnt)

 #else /* OPENSSL_THREADS */

-static ossl_unused ossl_inline int CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt,
+static ossl_unused ossl_inline bool CRYPTO_UP_REF(CRYPTO_REF_COUNT *refcnt,
     int *ret)
 {
     refcnt->val++;
     *ret = refcnt->val;
-    return 1;
+    return true;
 }

 static ossl_unused ossl_inline int CRYPTO_DOWN_REF(CRYPTO_REF_COUNT *refcnt,
diff --git a/providers/implementations/keymgmt/kdf_legacy_kmgmt.c b/providers/implementations/keymgmt/kdf_legacy_kmgmt.c
index deb4960006..7a772ad017 100644
--- a/providers/implementations/keymgmt/kdf_legacy_kmgmt.c
+++ b/providers/implementations/keymgmt/kdf_legacy_kmgmt.c
@@ -75,8 +75,7 @@ int ossl_kdf_data_up_ref(KDF_DATA *kdfdata)
     if (!ossl_prov_is_running())
         return 0;

-    CRYPTO_UP_REF(&kdfdata->refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&kdfdata->refcnt, &ref);
 }

 static void *kdf_newdata(void *provctx)
diff --git a/providers/implementations/keymgmt/mac_legacy_kmgmt.c b/providers/implementations/keymgmt/mac_legacy_kmgmt.c
index d3082ca772..4c2e8d8cd9 100644
--- a/providers/implementations/keymgmt/mac_legacy_kmgmt.c
+++ b/providers/implementations/keymgmt/mac_legacy_kmgmt.c
@@ -110,8 +110,7 @@ int ossl_mac_key_up_ref(MAC_KEY *mackey)
     if (!ossl_prov_is_running())
         return 0;

-    CRYPTO_UP_REF(&mackey->refcnt, &ref);
-    return 1;
+    return CRYPTO_UP_REF(&mackey->refcnt, &ref);
 }

 static void *mac_new(void *provctx)
diff --git a/ssl/quic/quic_impl.c b/ssl/quic/quic_impl.c
index 087c0dd582..99ddfd082e 100644
--- a/ssl/quic/quic_impl.c
+++ b/ssl/quic/quic_impl.c
@@ -5433,9 +5433,8 @@ int ossl_quic_get_peer_token(SSL_CTX *ctx, BIO_ADDR *peer,

     ossl_crypto_mutex_lock(c->mutex);
     tok = lh_QUIC_TOKEN_retrieve(c->cache, key);
-    if (tok != NULL) {
+    if (tok != NULL && CRYPTO_UP_REF(&tok->references, &ret)) {
         *token = tok;
-        CRYPTO_UP_REF(&tok->references, &ret);
         rc = 1;
     }

diff --git a/ssl/ssl_cert_comp.c b/ssl/ssl_cert_comp.c
index 2c297178e5..d6eadc5365 100644
--- a/ssl/ssl_cert_comp.c
+++ b/ssl/ssl_cert_comp.c
@@ -151,7 +151,7 @@ int OSSL_COMP_CERT_up_ref(OSSL_COMP_CERT *cc)
 {
     int i;

-    if (CRYPTO_UP_REF(&cc->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&cc->references, &i))
         return 0;

     REF_PRINT_COUNT("OSSL_COMP_CERT", i, cc);
diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c
index a900ad557a..57d74f9091 100644
--- a/ssl/ssl_lib.c
+++ b/ssl/ssl_lib.c
@@ -1012,7 +1012,7 @@ int SSL_up_ref(SSL *s)
 {
     int i;

-    if (CRYPTO_UP_REF(&s->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&s->references, &i))
         return 0;

     REF_PRINT_COUNT("SSL", i, s);
@@ -2088,7 +2088,9 @@ int SSL_copy_session_id(SSL *t, const SSL *f)
             return 0;
     }

-    CRYPTO_UP_REF(&fsc->cert->references, &i);
+    if (!CRYPTO_UP_REF(&fsc->cert->references, &i))
+        return 0;
+
     ssl_cert_free(tsc->cert);
     tsc->cert = fsc->cert;
     if (!SSL_set_session_id_context(t, fsc->sid_ctx, (int)fsc->sid_ctx_length)) {
@@ -4532,7 +4534,7 @@ int SSL_CTX_up_ref(SSL_CTX *ctx)
 {
     int i;

-    if (CRYPTO_UP_REF(&ctx->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&ctx->references, &i))
         return 0;

     REF_PRINT_COUNT("SSL_CTX", i, ctx);
@@ -5352,7 +5354,8 @@ SSL *SSL_dup(SSL *s)

     /* If we're not quiescent, just up_ref! */
     if (!SSL_in_init(s) || !SSL_in_before(s)) {
-        CRYPTO_UP_REF(&s->references, &i);
+        if (!CRYPTO_UP_REF(&s->references, &i))
+            return NULL;
         return s;
     }

diff --git a/ssl/ssl_sess.c b/ssl/ssl_sess.c
index 5604ca1354..ba0dcd229f 100644
--- a/ssl/ssl_sess.c
+++ b/ssl/ssl_sess.c
@@ -932,7 +932,7 @@ int SSL_SESSION_up_ref(SSL_SESSION *ss)
 {
     int i;

-    if (CRYPTO_UP_REF(&ss->references, &i) <= 0)
+    if (!CRYPTO_UP_REF(&ss->references, &i))
         return 0;

     REF_PRINT_COUNT("SSL_SESSION", i, ss);
diff --git a/test/tls-provider.c b/test/tls-provider.c
index c516cb04b4..34ea1652a0 100644
--- a/test/tls-provider.c
+++ b/test/tls-provider.c
@@ -725,7 +725,7 @@ static int xor_key_up_ref(XORKEY *key)
 {
     int refcnt;

-    if (CRYPTO_UP_REF(&key->references, &refcnt) <= 0)
+    if (!CRYPTO_UP_REF(&key->references, &refcnt))
         return 0;

     assert(refcnt > 1);