summaryrefslogtreecommitdiffstats
path: root/providers
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2019-09-19 11:52:45 +0100
committerMatt Caswell <matt@openssl.org>2019-11-29 16:14:44 +0000
commitcc38e643cbfb6da84fb2bb6a188698d0bc082a20 (patch)
treed07a3fcee80701c7511f7c54a696224282a0fdef /providers
parent14a684bfb091b12aa3094a6097932f76f799990a (diff)
Disable mem leak checking for the self test lock
The fips self test lock is deallocated in platform specific ways that may occur after we do mem leak checking. If we don't know how to free it for a particular platform then we just leak it deliberately. So we temporarily disable the mem leak checking while we allocate the lock. Reviewed-by: Paul Dale <paul.dale@oracle.com> Reviewed-by: Richard Levitte <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/9939)
Diffstat (limited to 'providers')
-rw-r--r--providers/fips/fipsprov.c9
-rw-r--r--providers/fips/selftest.c8
2 files changed, 17 insertions, 0 deletions
diff --git a/providers/fips/fipsprov.c b/providers/fips/fipsprov.c
index 12c471f325..6a5ae3a3f1 100644
--- a/providers/fips/fipsprov.c
+++ b/providers/fips/fipsprov.c
@@ -60,6 +60,7 @@ static OSSL_CRYPTO_secure_zalloc_fn *c_CRYPTO_secure_zalloc;
static OSSL_CRYPTO_secure_free_fn *c_CRYPTO_secure_free;
static OSSL_CRYPTO_secure_clear_free_fn *c_CRYPTO_secure_clear_free;
static OSSL_CRYPTO_secure_allocated_fn *c_CRYPTO_secure_allocated;
+static OSSL_CRYPTO_mem_ctrl_fn *c_CRYPTO_mem_ctrl;
typedef struct fips_global_st {
const OSSL_PROVIDER *prov;
@@ -515,6 +516,9 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider,
case OSSL_FUNC_CRYPTO_SECURE_ALLOCATED:
c_CRYPTO_secure_allocated = OSSL_get_CRYPTO_secure_allocated(in);
break;
+ case OSSL_FUNC_CRYPTO_MEM_CTRL:
+ c_CRYPTO_mem_ctrl = OSSL_get_CRYPTO_mem_ctrl(in);
+ break;
case OSSL_FUNC_BIO_NEW_FILE:
selftest_params.bio_new_file_cb = OSSL_get_BIO_new_file(in);
break;
@@ -700,3 +704,8 @@ int CRYPTO_secure_allocated(const void *ptr)
{
return c_CRYPTO_secure_allocated(ptr);
}
+
+int CRYPTO_mem_ctrl(int mode)
+{
+ return c_CRYPTO_mem_ctrl(mode);
+}
diff --git a/providers/fips/selftest.c b/providers/fips/selftest.c
index ad7dab2021..369a6bab3b 100644
--- a/providers/fips/selftest.c
+++ b/providers/fips/selftest.c
@@ -40,7 +40,15 @@ static unsigned char fixed_key[32] = { 0 };
static CRYPTO_ONCE fips_self_test_init = CRYPTO_ONCE_STATIC_INIT;
DEFINE_RUN_ONCE_STATIC(do_fips_self_test_init)
{
+ /*
+ * This lock gets freed in platform specific ways that may occur after we
+ * do mem leak checking. If we don't know how to free it for a particular
+ * platform then we just leak it deliberately. So we temporarily disable the
+ * mem leak checking while we allocate this.
+ */
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
self_test_lock = CRYPTO_THREAD_lock_new();
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
return self_test_lock != NULL;
}