summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorNeil Horman <nhorman@openssl.org>2024-02-02 08:10:32 -0500
committerPauli <ppzgs1@gmail.com>2024-04-24 11:39:41 +1000
commitd092208bd694c9f9b276965bcf2d33f164535b2f (patch)
tree5c63da0af1167d3caf79c29feecf7fd56201a7cd /test
parent264ff64b9443e60c7c93af0ced2b22fdf622d179 (diff)
Fix potential divide by zero error
Coverity caught the following issues: 1591477 1591475 1591473 1591470 all of which are simmilar, in that they catch potential divide by zero in double values. It can't actually happen since the the threads which increment these counters don't exit until they reach non-zero values, but its easy to add the checks, so lets do that to ensure that we don't change something in the future that causes it. Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/23462)
Diffstat (limited to 'test')
-rw-r--r--test/threadstest.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/test/threadstest.c b/test/threadstest.c
index c208c37d0a..0e42d63e10 100644
--- a/test/threadstest.c
+++ b/test/threadstest.c
@@ -257,6 +257,11 @@ static int _torture_rw(void)
TEST_info("performed %d reads and %d writes over 2 read and 2 write threads in %e seconds",
rwreader1_iterations + rwreader2_iterations,
rwwriter1_iterations + rwwriter2_iterations, tottime);
+ if ((rwreader1_iterations + rwreader2_iterations == 0)
+ || (rwwriter1_iterations + rwwriter2_iterations == 0)) {
+ TEST_info("Threads did not iterate\n");
+ goto out;
+ }
avr = tottime / (rwreader1_iterations + rwreader2_iterations);
avw = (tottime / (rwwriter1_iterations + rwwriter2_iterations));
TEST_info("Average read time %e/read", avr);
@@ -405,6 +410,7 @@ static int _torture_rcu(void)
struct timeval dtime;
double tottime;
double avr, avw;
+ int rc = 0;
atomiclock = CRYPTO_THREAD_lock_new();
memset(&writer1, 0, sizeof(thread_t));
@@ -432,7 +438,7 @@ static int _torture_rcu(void)
|| !TEST_true(wait_for_thread(writer2))
|| !TEST_true(wait_for_thread(reader1))
|| !TEST_true(wait_for_thread(reader2)))
- return 0;
+ goto out;
t2 = ossl_time_now();
dtime = ossl_time_to_timeval(ossl_time_subtract(t2, t1));
@@ -441,17 +447,27 @@ static int _torture_rcu(void)
TEST_info("performed %d reads and %d writes over 2 read and 2 write threads in %e seconds",
reader1_iterations + reader2_iterations,
writer1_iterations + writer2_iterations, tottime);
+ if ((reader1_iterations + reader2_iterations == 0)
+ || (writer1_iterations + writer2_iterations == 0)) {
+ TEST_info("Threads did not iterate\n");
+ goto out;
+ }
avr = tottime / (reader1_iterations + reader2_iterations);
avw = tottime / (writer1_iterations + writer2_iterations);
TEST_info("Average read time %e/read", avr);
TEST_info("Average write time %e/write", avw);
+ if (!TEST_int_eq(rcu_torture_result, 1))
+ goto out;
+
+ rc = 1;
+out:
ossl_rcu_lock_free(rcu_lock);
CRYPTO_THREAD_lock_free(atomiclock);
if (!TEST_int_eq(rcu_torture_result, 1))
return 0;
- return 1;
+ return rc;
}
static int torture_rcu_low(void)