From cc38e643cbfb6da84fb2bb6a188698d0bc082a20 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Thu, 19 Sep 2019 11:52:45 +0100 Subject: [PATCH] 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 Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/9939) --- crypto/provider_core.c | 1 + doc/man7/provider-base.pod | 3 ++- include/openssl/core_numbers.h | 10 ++++++---- providers/fips/fipsprov.c | 9 +++++++++ providers/fips/selftest.c | 8 ++++++++ 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/crypto/provider_core.c b/crypto/provider_core.c index 4f3123d672..9e92e96b10 100644 --- a/crypto/provider_core.c +++ b/crypto/provider_core.c @@ -889,6 +889,7 @@ static const OSSL_DISPATCH core_dispatch_[] = { { OSSL_FUNC_CRYPTO_SECURE_ALLOCATED, (void (*)(void))CRYPTO_secure_allocated }, { OSSL_FUNC_OPENSSL_CLEANSE, (void (*)(void))OPENSSL_cleanse }, + { OSSL_FUNC_CRYPTO_MEM_CTRL, (void (*)(void))CRYPTO_mem_ctrl }, { 0, NULL } }; diff --git a/doc/man7/provider-base.pod b/doc/man7/provider-base.pod index 1b4b47d02a..08d807f572 100644 --- a/doc/man7/provider-base.pod +++ b/doc/man7/provider-base.pod @@ -108,6 +108,7 @@ provider): CRYPTO_secure_free OSSL_FUNC_CRYPTO_SECURE_FREE CRYPTO_secure_clear_free OSSL_FUNC_CRYPTO_SECURE_CLEAR_FREE CRYPTO_secure_allocated OSSL_FUNC_CRYPTO_SECURE_ALLOCATED + CRYPTO_mem_ctrl OSSL_FUNC_CRYPTO_MEM_CTRL BIO_new_file OSSL_FUNC_BIO_NEW_FILE BIO_new_mem_buf OSSL_FUNC_BIO_NEW_MEMBUF BIO_read_ex OSSL_FUNC_BIO_READ_EX @@ -181,7 +182,7 @@ CRYPTO_malloc(), CRYPTO_zalloc(), CRYPTO_memdup(), CRYPTO_strdup(), CRYPTO_strndup(), CRYPTO_free(), CRYPTO_clear_free(), CRYPTO_realloc(), CRYPTO_clear_realloc(), CRYPTO_secure_malloc(), CRYPTO_secure_zalloc(), CRYPTO_secure_free(), -CRYPTO_secure_clear_free(), CRYPTO_secure_allocated(), +CRYPTO_secure_clear_free(), CRYPTO_secure_allocated(), CRYPTO_mem_ctrl(), BIO_new_file(), BIO_new_mem_buf(), BIO_read_ex(), BIO_free(), OPENSSL_cleanse(), and OPENSSL_hexstr2buf() correspond exactly to the public functions with the same name. diff --git a/include/openssl/core_numbers.h b/include/openssl/core_numbers.h index 686944c28d..d07ef556d9 100644 --- a/include/openssl/core_numbers.h +++ b/include/openssl/core_numbers.h @@ -119,12 +119,14 @@ OSSL_CORE_MAKE_FUNC(int, #define OSSL_FUNC_OPENSSL_CLEANSE 21 OSSL_CORE_MAKE_FUNC(void, OPENSSL_cleanse, (void *ptr, size_t len)) +#define OSSL_FUNC_CRYPTO_MEM_CTRL 22 +OSSL_CORE_MAKE_FUNC(int, CRYPTO_mem_ctrl, (int mode)) /* Bio functions provided by the core */ -#define OSSL_FUNC_BIO_NEW_FILE 22 -#define OSSL_FUNC_BIO_NEW_MEMBUF 23 -#define OSSL_FUNC_BIO_READ_EX 24 -#define OSSL_FUNC_BIO_FREE 25 +#define OSSL_FUNC_BIO_NEW_FILE 23 +#define OSSL_FUNC_BIO_NEW_MEMBUF 24 +#define OSSL_FUNC_BIO_READ_EX 25 +#define OSSL_FUNC_BIO_FREE 26 OSSL_CORE_MAKE_FUNC(BIO *, BIO_new_file, (const char *filename, const char *mode)) OSSL_CORE_MAKE_FUNC(BIO *, BIO_new_membuf, (const void *buf, int len)) 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; } -- 2.25.1