]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Unify the int32_t vs int_fast32_t when working with atomic types
authorOndřej Surý <ondrej@isc.org>
Mon, 14 Apr 2025 16:56:54 +0000 (18:56 +0200)
committerOndřej Surý <ondrej@isc.org>
Mon, 14 Apr 2025 17:40:09 +0000 (17:40 +0000)
There's a mismatch between the atomic and non-atomic types that could
potentialy lead to a rwlock deadlock (after two billion 2^32) writes.
Use int_fast32_t when loading the atomic_int_fast32_t types in the
isc_rwlock unit.

(cherry picked from commit 86673ee67aacf677c96f8272e4a0b9fa65e06310)

lib/isc/rwlock.c

index aa1156555db3d56a9f93ffcbe00d40429337f0d0..2617e554ad5f4120dd5cec56af400bb894760e7d 100644 (file)
@@ -307,7 +307,7 @@ isc_rwlock_destroy(isc_rwlock_t *rwl) {
 
 static isc_result_t
 isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
-       int32_t cntflag;
+       int_fast32_t cntflag;
 
        REQUIRE(VALID_RWLOCK(rwl));
 
@@ -385,7 +385,7 @@ isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
                 */
                atomic_store_release(&rwl->write_granted, 0);
        } else {
-               int32_t prev_writer;
+               int_fast32_t prev_writer;
 
                /* enter the waiting queue, and wait for our turn */
                prev_writer = atomic_fetch_add_release(&rwl->write_requests, 1);
@@ -430,9 +430,9 @@ isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
 
 isc_result_t
 isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
-       int32_t cnt = 0;
-       int32_t spins = atomic_load_acquire(&rwl->spins) * 2 + 10;
-       int32_t max_cnt = ISC_MAX(spins, RWLOCK_MAX_ADAPTIVE_COUNT);
+       int_fast32_t cnt = 0;
+       int_fast32_t spins = atomic_load_acquire(&rwl->spins) * 2 + 10;
+       int_fast32_t max_cnt = ISC_MAX(spins, RWLOCK_MAX_ADAPTIVE_COUNT);
        isc_result_t result = ISC_R_SUCCESS;
 
        do {
@@ -450,7 +450,7 @@ isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
 
 isc_result_t
 isc_rwlock_trylock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
-       int32_t cntflag;
+       int_fast32_t cntflag;
 
        REQUIRE(VALID_RWLOCK(rwl));
 
@@ -547,7 +547,7 @@ isc_rwlock_tryupgrade(isc_rwlock_t *rwl) {
 
 void
 isc_rwlock_downgrade(isc_rwlock_t *rwl) {
-       int32_t prev_readers;
+       int_fast32_t prev_readers;
 
        REQUIRE(VALID_RWLOCK(rwl));
 
@@ -571,7 +571,7 @@ isc_rwlock_downgrade(isc_rwlock_t *rwl) {
 
 isc_result_t
 isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
-       int32_t prev_cnt;
+       int_fast32_t prev_cnt;
 
        REQUIRE(VALID_RWLOCK(rwl));