diff options
author | Hugo Landau <hlandau@openssl.org> | 2023-02-22 18:01:28 +0100 |
---|---|---|
committer | Hugo Landau <hlandau@openssl.org> | 2023-03-30 12:14:09 +0200 |
commit | 99ed85bba9de5d9983d3796c18e62041d3ce6575 (patch) | |
tree | 62630914fd43e8b2f5fd3139a18b7e908f7ada5c | |
parent | Minor fixes to thread assisted mode (diff) | |
download | openssl-99ed85bba9de5d9983d3796c18e62041d3ce6575.tar.xz openssl-99ed85bba9de5d9983d3796c18e62041d3ce6575.zip |
Avoid races in tserver test code
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/20348)
-rw-r--r-- | test/quic_tserver_test.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/test/quic_tserver_test.c b/test/quic_tserver_test.c index eeb23b4b90..e5391648a3 100644 --- a/test/quic_tserver_test.c +++ b/test/quic_tserver_test.c @@ -19,6 +19,7 @@ static const char msg1[] = "The quick brown fox jumped over the lazy dogs."; static char msg2[1024], msg3[1024]; static OSSL_TIME fake_time; +static CRYPTO_RWLOCK *fake_time_lock; static const char *certfile, *keyfile; @@ -33,7 +34,15 @@ static unsigned char scratch_buf[2048]; static OSSL_TIME fake_now(void *arg) { - return fake_time; + OSSL_TIME t; + + if (!CRYPTO_THREAD_read_lock(fake_time_lock)) + return ossl_time_zero(); + + t = fake_time; + + CRYPTO_THREAD_unlock(fake_time_lock); + return t; } static OSSL_TIME real_now(void *arg) @@ -286,9 +295,14 @@ static int do_test(int use_thread_assist, int use_fake_time, int use_inject) if (c_start_idle_test && !c_done_idle_test) { /* This is more than our default idle timeout of 30s. */ if (idle_units_done < 600) { + if (!TEST_true(CRYPTO_THREAD_write_lock(fake_time_lock))) + goto err; fake_time = ossl_time_add(fake_time, ossl_ms2time(100)); + CRYPTO_THREAD_unlock(fake_time_lock); + ++idle_units_done; ossl_quic_conn_force_assist_thread_wake(c_ssl); + OSSL_sleep(1); /* Ensure CPU scheduling for test purposes */ } else { c_done_idle_test = 1; } @@ -397,6 +411,9 @@ int setup_tests(void) || !TEST_ptr(keyfile = test_get_argument(1))) return 0; + if ((fake_time_lock = CRYPTO_THREAD_lock_new()) == NULL) + return 0; + ADD_TEST(test_tserver_simple); ADD_TEST(test_tserver_thread); ADD_TEST(test_tserver_thread_fake_time); |