From: Neil Horman Date: Thu, 13 Feb 2025 20:52:16 +0000 (-0500) Subject: Don't use __ATOMIC_ACQ_REL on older compilers X-Git-Tag: openssl-3.4.2~186 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ec7c1ca8794eb9f80542d8d1df33ca65554e58a0;p=thirdparty%2Fopenssl.git Don't use __ATOMIC_ACQ_REL on older compilers Older compilers don't always support __ATOMIC_ACQ_REL, use a lock where they don't Reviewed-by: Tomas Mraz Reviewed-by: Bernd Edlinger (Merged from https://github.com/openssl/openssl/pull/26747) (cherry picked from commit 7d284560a0624206356d46a948ab3a0b6f670c0e) --- diff --git a/crypto/threads_pthread.c b/crypto/threads_pthread.c index 6ba01375ff2..655a23d99e2 100644 --- a/crypto/threads_pthread.c +++ b/crypto/threads_pthread.c @@ -90,7 +90,6 @@ __tsan_mutex_post_lock((x), 0, 0) * fallback function names. */ typedef void *pvoid; -typedef struct rcu_cb_item *prcu_cb_item; # if defined(__GNUC__) && defined(__ATOMIC_ACQUIRE) && !defined(BROKEN_CLANG_ATOMICS) \ && !defined(USE_ATOMIC_FALLBACKS) @@ -193,7 +192,6 @@ IMPL_fallback_atomic_store(pvoid) return ret; \ } IMPL_fallback_atomic_exchange_n(uint64_t) -IMPL_fallback_atomic_exchange_n(prcu_cb_item) # define ATOMIC_EXCHANGE_N(t, p, v, o) fallback_atomic_exchange_n_##t(p, v) @@ -583,6 +581,10 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock) } } +/* + * Note: This call assumes its made under the protection of + * ossl_rcu_write_lock + */ int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data) { struct rcu_cb_item *new = @@ -593,13 +595,9 @@ int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data) new->data = data; new->fn = cb; - /* - * Use __ATOMIC_ACQ_REL here to indicate that any prior writes to this - * list are visible to us prior to reading, and publish the new value - * immediately - */ - new->next = ATOMIC_EXCHANGE_N(prcu_cb_item, &lock->cb_items, new, - __ATOMIC_ACQ_REL); + + new->next = lock->cb_items; + lock->cb_items = new; return 1; } diff --git a/crypto/threads_win.c b/crypto/threads_win.c index 71823d21b09..b4208d26758 100644 --- a/crypto/threads_win.c +++ b/crypto/threads_win.c @@ -365,7 +365,10 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock) struct rcu_cb_item *cb_items, *tmpcb; /* before we do anything else, lets grab the cb list */ - cb_items = InterlockedExchangePointer((void * volatile *)&lock->cb_items, NULL); + ossl_crypto_mutex_lock(lock->write_lock); + cb_items = lock->cb_items; + lock->cb_items = NULL; + ossl_crypto_mutex_unlock(lock->write_lock); qp = update_qp(lock, &curr_id); @@ -398,6 +401,9 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock) } +/* + * Note, must be called under the protection of ossl_rcu_write_lock + */ int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data) { struct rcu_cb_item *new; @@ -408,7 +414,9 @@ int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data) new->data = data; new->fn = cb; - new->next = InterlockedExchangePointer((void * volatile *)&lock->cb_items, new); + new->next = lock->cb_items; + lock->cb_items = new; + return 1; }