summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2016-09-05 14:12:58 +0100
committerMatt Caswell <matt@openssl.org>2016-09-08 12:40:19 +0100
commit135648bcd0e9db029582d3d7627a90a1b566c5d6 (patch)
tree9f27d7c5bc25abe4355872360aa99ffd86358e36 /crypto
parent2d11f5b2ca863d4bd9e20b224932b247ed85842b (diff)
Fix mem leaks during auto-deinit
Certain functions are automatically called during auto-deinit in order to deallocate resources. However, if we have never entered a function which marks lib crypto as inited then they never get called. This can happen if the user only ever makes use of a small sub-set of functions that don't hit the auto-init code. This commit ensures all such resources deallocated by these functions also init libcrypto when they are initially allocated. Reviewed-by: Richard Levitte <levitte@openssl.org> Reviewed-by: Ben Laurie <ben@openssl.org>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/bio/b_addr.c1
-rw-r--r--crypto/engine/eng_lib.c1
-rw-r--r--crypto/err/err.c1
-rw-r--r--crypto/ex_data.c1
-rw-r--r--crypto/rand/md_rand.c1
5 files changed, 5 insertions, 0 deletions
diff --git a/crypto/bio/b_addr.c b/crypto/bio/b_addr.c
index f924e1029f..29f92cf7c7 100644
--- a/crypto/bio/b_addr.c
+++ b/crypto/bio/b_addr.c
@@ -604,6 +604,7 @@ static int addrinfo_wrap(int family, int socktype,
DEFINE_RUN_ONCE_STATIC(do_bio_lookup_init)
{
+ OPENSSL_init_crypto(0, NULL);
bio_lookup_lock = CRYPTO_THREAD_lock_new();
return bio_lookup_lock != NULL;
}
diff --git a/crypto/engine/eng_lib.c b/crypto/engine/eng_lib.c
index 67d755a2aa..28de21d73d 100644
--- a/crypto/engine/eng_lib.c
+++ b/crypto/engine/eng_lib.c
@@ -18,6 +18,7 @@ CRYPTO_ONCE engine_lock_init = CRYPTO_ONCE_STATIC_INIT;
DEFINE_RUN_ONCE(do_engine_lock_init)
{
+ OPENSSL_init_crypto(0, NULL);
global_engine_lock = CRYPTO_THREAD_lock_new();
return global_engine_lock != NULL;
}
diff --git a/crypto/err/err.c b/crypto/err/err.c
index 584bb9e10d..c3f7212a78 100644
--- a/crypto/err/err.c
+++ b/crypto/err/err.c
@@ -251,6 +251,7 @@ static void ERR_STATE_free(ERR_STATE *s)
DEFINE_RUN_ONCE_STATIC(do_err_strings_init)
{
+ OPENSSL_init_crypto(0, NULL);
err_string_lock = CRYPTO_THREAD_lock_new();
return err_string_lock != NULL;
}
diff --git a/crypto/ex_data.c b/crypto/ex_data.c
index 986ef70bc4..bb1af0b3b1 100644
--- a/crypto/ex_data.c
+++ b/crypto/ex_data.c
@@ -38,6 +38,7 @@ static CRYPTO_ONCE ex_data_init = CRYPTO_ONCE_STATIC_INIT;
DEFINE_RUN_ONCE_STATIC(do_ex_data_init)
{
+ OPENSSL_init_crypto(0, NULL);
ex_data_lock = CRYPTO_THREAD_lock_new();
return ex_data_lock != NULL;
}
diff --git a/crypto/rand/md_rand.c b/crypto/rand/md_rand.c
index 7924478e9e..85ce4e6f98 100644
--- a/crypto/rand/md_rand.c
+++ b/crypto/rand/md_rand.c
@@ -89,6 +89,7 @@ static RAND_METHOD rand_meth = {
DEFINE_RUN_ONCE_STATIC(do_rand_lock_init)
{
+ OPENSSL_init_crypto(0, NULL);
rand_lock = CRYPTO_THREAD_lock_new();
rand_tmp_lock = CRYPTO_THREAD_lock_new();
return rand_lock != NULL && rand_tmp_lock != NULL;