diff options
author | Matt Caswell <matt@openssl.org> | 2021-11-09 18:31:24 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2021-11-15 14:22:41 +0000 |
commit | f6c418af502e11c88a3ecb6db1816ce27de0210a (patch) | |
tree | 029c2ddfab24e55bcc4d6da4763a3bb494d990e6 /test | |
parent | cff311bff1b652194c8979c685f3efd66e147661 (diff) |
Extend the test_multi_load() test
Run more threads and load the legacy provider (which uses a child lib ctx)
in order to hit more possible thread failures.
Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/17018)
Diffstat (limited to 'test')
-rw-r--r-- | test/threadstest.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/test/threadstest.c b/test/threadstest.c index 3160d9e334..505dd79e95 100644 --- a/test/threadstest.c +++ b/test/threadstest.c @@ -464,18 +464,20 @@ static int test_multi(int idx) return testresult; } +static char *multi_load_provider = "legacy"; /* * This test attempts to load several providers at the same time, and if * run with a thread sanitizer, should crash if the core provider code * doesn't synchronize well enough. */ -#define MULTI_LOAD_THREADS 3 +#define MULTI_LOAD_THREADS 10 static void test_multi_load_worker(void) { OSSL_PROVIDER *prov; - (void)TEST_ptr(prov = OSSL_PROVIDER_load(NULL, "default")); - (void)TEST_true(OSSL_PROVIDER_unload(prov)); + if (!TEST_ptr(prov = OSSL_PROVIDER_load(NULL, multi_load_provider)) + || !TEST_true(OSSL_PROVIDER_unload(prov))) + multi_success = 0; } static int test_multi_default(void) @@ -519,6 +521,7 @@ static int test_multi_load(void) { thread_t threads[MULTI_LOAD_THREADS]; int i, res = 1; + OSSL_PROVIDER *prov; /* The multidefault test must run prior to this test */ if (!multidefault_run) { @@ -526,13 +529,27 @@ static int test_multi_load(void) res = test_multi_default(); } + /* + * We use the legacy provider in test_multi_load_worker because it uses a + * child libctx that might hit more codepaths that might be sensitive to + * threading issues. But in a no-legacy build that won't be loadable so + * we use the default provider instead. + */ + prov = OSSL_PROVIDER_load(NULL, "legacy"); + if (prov == NULL) { + TEST_info("Cannot load legacy provider - assuming this is a no-legacy build"); + multi_load_provider = "default"; + } + OSSL_PROVIDER_unload(prov); + + multi_success = 1; for (i = 0; i < MULTI_LOAD_THREADS; i++) (void)TEST_true(run_thread(&threads[i], test_multi_load_worker)); for (i = 0; i < MULTI_LOAD_THREADS; i++) (void)TEST_true(wait_for_thread(threads[i])); - return res; + return res && multi_success; } typedef enum OPTION_choice { |