From: Neil Horman Date: Mon, 29 Jul 2024 19:12:00 +0000 (-0400) Subject: Add error checking to CRYPTO_atomic_[load|store] calls X-Git-Tag: openssl-3.4.0-alpha1~257 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9bd5e92aff83c24e0c6fdab1846340fae226dbb3;p=thirdparty%2Fopenssl.git Add error checking to CRYPTO_atomic_[load|store] calls Noted that we didn't check return codes of the atomic loads/stores in the new hashtable, and they can fail Reviewed-by: Tomas Mraz Reviewed-by: Tom Cosgrove (Merged from https://github.com/openssl/openssl/pull/24969) --- diff --git a/crypto/hashtable/hashtable.c b/crypto/hashtable/hashtable.c index b24b6457149..c7ceafd6dcf 100644 --- a/crypto/hashtable/hashtable.c +++ b/crypto/hashtable/hashtable.c @@ -529,8 +529,11 @@ static int ossl_ht_insert_locked(HT *h, uint64_t hash, for (j = 0; j < NEIGHBORHOOD_LEN; j++) { ival = ossl_rcu_deref(&md->neighborhoods[neigh_idx].entries[j].value); - CRYPTO_atomic_load(&md->neighborhoods[neigh_idx].entries[j].hash, - &ihash, h->atomic_lock); + + if (!CRYPTO_atomic_load(&md->neighborhoods[neigh_idx].entries[j].hash, + &ihash, h->atomic_lock)) + return 0; + if (ival == NULL) empty_idx = j; if (compare_hash(hash, ihash)) { @@ -539,8 +542,10 @@ static int ossl_ht_insert_locked(HT *h, uint64_t hash, return 0; } /* Do a replacement */ - CRYPTO_atomic_store(&md->neighborhoods[neigh_idx].entries[j].hash, - hash, h->atomic_lock); + if (!CRYPTO_atomic_store(&md->neighborhoods[neigh_idx].entries[j].hash, + hash, h->atomic_lock)) + return 0; + *olddata = (HT_VALUE *)md->neighborhoods[neigh_idx].entries[j].value; ossl_rcu_assign_ptr(&md->neighborhoods[neigh_idx].entries[j].value, &newval); @@ -553,8 +558,9 @@ static int ossl_ht_insert_locked(HT *h, uint64_t hash, if (empty_idx == SIZE_MAX) return -1; /* out of space */ h->wpd.value_count++; - CRYPTO_atomic_store(&md->neighborhoods[neigh_idx].entries[empty_idx].hash, - hash, h->atomic_lock); + if (!CRYPTO_atomic_store(&md->neighborhoods[neigh_idx].entries[empty_idx].hash, + hash, h->atomic_lock)) + return 0; ossl_rcu_assign_ptr(&md->neighborhoods[neigh_idx].entries[empty_idx].value, &newval); return 1; @@ -635,8 +641,9 @@ HT_VALUE *ossl_ht_get(HT *h, HT_KEY *key) neigh_idx = hash & md->neighborhood_mask; PREFETCH_NEIGHBORHOOD(md->neighborhoods[neigh_idx]); for (j = 0; j < NEIGHBORHOOD_LEN; j++) { - CRYPTO_atomic_load(&md->neighborhoods[neigh_idx].entries[j].hash, - &ehash, h->atomic_lock); + if (!CRYPTO_atomic_load(&md->neighborhoods[neigh_idx].entries[j].hash, + &ehash, h->atomic_lock)) + break; if (compare_hash(hash, ehash)) { vidx = ossl_rcu_deref(&md->neighborhoods[neigh_idx].entries[j].value); ret = (HT_VALUE *)vidx; @@ -672,8 +679,9 @@ int ossl_ht_delete(HT *h, HT_KEY *key) for (j = 0; j < NEIGHBORHOOD_LEN; j++) { if (compare_hash(hash, md->neighborhoods[neigh_idx].entries[j].hash)) { h->wpd.value_count--; - CRYPTO_atomic_store(&md->neighborhoods[neigh_idx].entries[j].hash, - 0, h->atomic_lock); + if (!CRYPTO_atomic_store(&md->neighborhoods[neigh_idx].entries[j].hash, + 0, h->atomic_lock)) + break; v = (struct ht_internal_value_st *)md->neighborhoods[neigh_idx].entries[j].value; ossl_rcu_assign_ptr(&md->neighborhoods[neigh_idx].entries[j].value, &nv);