From: Ondřej Surý Date: Mon, 14 Apr 2025 16:56:54 +0000 (+0200) Subject: Unify the int32_t vs int_fast32_t when working with atomic types X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae54bd80764300982045f5611adcfce13262b2f4;p=thirdparty%2Fbind9.git Unify the int32_t vs int_fast32_t when working with atomic types 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) --- diff --git a/lib/isc/rwlock.c b/lib/isc/rwlock.c index aa1156555db..2617e554ad5 100644 --- a/lib/isc/rwlock.c +++ b/lib/isc/rwlock.c @@ -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));