From 86673ee67aacf677c96f8272e4a0b9fa65e06310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 14 Apr 2025 18:56:54 +0200 Subject: [PATCH] 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. --- lib/isc/rwlock.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/isc/rwlock.c b/lib/isc/rwlock.c index 96ccbc96d3..cd78156e4a 100644 --- a/lib/isc/rwlock.c +++ b/lib/isc/rwlock.c @@ -305,7 +305,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)); @@ -383,7 +383,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); @@ -427,9 +427,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 { @@ -447,7 +447,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)); @@ -544,7 +544,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)); @@ -568,7 +568,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));