summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2021-11-09 18:31:24 +0000
committerMatt Caswell <matt@openssl.org>2021-11-15 14:22:41 +0000
commitf6c418af502e11c88a3ecb6db1816ce27de0210a (patch)
tree029c2ddfab24e55bcc4d6da4763a3bb494d990e6 /test
parentcff311bff1b652194c8979c685f3efd66e147661 (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.c25
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 {