It is interesting that in the very rare cases, where this
test failure has been observed so far, the rcu torture value
went always backwards to 0. This could be either due to
ossl_rcu_deref(&writer_ptr) returning NULL, or the initial
value of "new = CRYPTO_zalloc(sizeof(uint64_t), NULL, 0)"
still visible despite ossl_rcu_assign_ptr(&writer_ptr, &new)
immediatley after the "*new = global_ctr++" statement.
Add one additional trace message to find out what exactly
happens here, when it happens again.
Additionally, we do no longer initialize the new value to
zero but something else, so it can also be detected.
Related to #27267
Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/28487)
(cherry picked from commit
17d5c9297ef6f6a4d72788082d6772deb7a18f24)
t1 = ossl_time_now();
for (count = 0; ; count++) {
- new = CRYPTO_zalloc(sizeof(uint64_t), NULL, 0);
+ new = CRYPTO_malloc(sizeof(uint64_t), NULL, 0);
+ *new = (uint64_t)0xBAD;
if (contention == 0)
OSSL_sleep(1000);
ossl_rcu_write_lock(rcu_lock);
if (oldval > val) {
TEST_info("rcu torture value went backwards! %llu : %llu", (unsigned long long)oldval, (unsigned long long)val);
+ if (valp == NULL)
+ TEST_info("ossl_rcu_deref did return NULL!");
rcu_torture_result = 0;
}
oldval = val; /* just try to deref the pointer */