From b7326ea7106955a7a5b8190fb19c982b49b7c821 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Tue, 9 Feb 2016 23:09:44 +0000 Subject: [PATCH] NULL the thread_local_inits_st pointer after use After the final use of the thread_local_inits_st we should ensure it is set to NULL, just in case OPENSSL_INIT_thread_stop gets called again and it tries to use garbage. Reviewed-by: Rich Salz --- crypto/include/internal/cryptlib_int.h | 2 +- crypto/init.c | 24 +++++++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/crypto/include/internal/cryptlib_int.h b/crypto/include/internal/cryptlib_int.h index 36c0a10e03..0e457623ff 100644 --- a/crypto/include/internal/cryptlib_int.h +++ b/crypto/include/internal/cryptlib_int.h @@ -63,7 +63,7 @@ struct thread_local_inits_st { int async; int err_state; }; -void *ossl_init_get_thread_local(int alloc); + int ossl_init_thread_start(uint64_t opts); /* * OPENSSL_INIT flags. The primary list of these is in crypto.h. Flags below diff --git a/crypto/init.c b/crypto/init.c index b9cc6a1f76..f23227e60a 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -95,11 +95,19 @@ static void ossl_init_thread_stop_cleanup(void) } static struct thread_local_inits_st *local = NULL; -void *ossl_init_get_thread_local(int alloc) +static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc) { + static struct thread_local_inits_st *tmp; + + tmp = local; + if (local == NULL && alloc) - local = OPENSSL_zalloc(sizeof(*local)); - return local; + tmp = local = OPENSSL_zalloc(sizeof(*local)); + + if (!alloc) + local = NULL; + + return tmp; } #elif defined(OPENSSL_SYS_WINDOWS) @@ -182,7 +190,7 @@ static void ossl_init_thread_stop_cleanup(void) } } -void *ossl_init_get_thread_local(int alloc) +static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc) { struct thread_local_inits_st *local = TlsGetValue(threadstopkey); @@ -190,6 +198,9 @@ void *ossl_init_get_thread_local(int alloc) local = OPENSSL_zalloc(sizeof *local); TlsSetValue(threadstopkey, local); } + if (!alloc) { + TlsSetValue(threadstopkey, NULL); + } return local; } @@ -227,7 +238,7 @@ static void ossl_init_thread_stop_cleanup(void) { } -void *ossl_init_get_thread_local(int alloc) +static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc) { struct thread_local_inits_st *local = pthread_getspecific(threadstopkey); @@ -235,6 +246,9 @@ void *ossl_init_get_thread_local(int alloc) local = OPENSSL_zalloc(sizeof *local); pthread_setspecific(threadstopkey, local); } + if (!alloc) { + pthread_setspecific(threadstopkey, NULL); + } return local; } -- 2.25.1