From: Ondřej Surý Date: Mon, 9 Sep 2024 14:03:53 +0000 (+0200) Subject: Use release memory ordering when incrementing reference counter X-Git-Tag: v9.21.2~11^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88227ea6655ec513d555ad0cdb52d22e7f9928a2;p=thirdparty%2Fbind9.git Use release memory ordering when incrementing reference counter As the relaxed memory ordering doesn't ensure any memory synchronization, it is possible that the increment will succeed even in the case when it should not - there is a race between atomic_fetch_sub(..., acq_rel) and atomic_fetch_add(..., relaxed). Only the result is consistent, but the previous value for both calls could be same when both calls are executed at the same time. --- diff --git a/lib/isc/include/isc/refcount.h b/lib/isc/include/isc/refcount.h index 090dc7ec2a7..82f5796bd60 100644 --- a/lib/isc/include/isc/refcount.h +++ b/lib/isc/include/isc/refcount.h @@ -70,7 +70,7 @@ typedef atomic_uint_fast32_t isc_refcount_t; #define isc_refcount_increment0(target) \ ({ \ uint_fast32_t __v; \ - __v = atomic_fetch_add_relaxed(target, 1); \ + __v = atomic_fetch_add_release(target, 1); \ INSIST(__v < UINT32_MAX); \ __v; \ }) @@ -83,7 +83,7 @@ typedef atomic_uint_fast32_t isc_refcount_t; #define isc_refcount_increment(target) \ ({ \ uint_fast32_t __v; \ - __v = atomic_fetch_add_relaxed(target, 1); \ + __v = atomic_fetch_add_release(target, 1); \ INSIST(__v > 0 && __v < UINT32_MAX); \ __v; \ })