diff options
author | Matt Caswell <matt@openssl.org> | 2016-02-09 23:09:44 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2016-02-09 23:29:31 +0000 |
commit | b7326ea7106955a7a5b8190fb19c982b49b7c821 (patch) | |
tree | ffb1f036ac3f322aa3b2ea90b3344f839463287c /crypto | |
parent | 38a6d7f89a6d060b7d463cbdd15eada434bb2d69 (diff) |
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 <rsalz@openssl.org>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/include/internal/cryptlib_int.h | 2 | ||||
-rw-r--r-- | 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; } |