summaryrefslogtreecommitdiffstats
path: root/crypto/init.c
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2016-02-09 23:09:44 +0000
committerMatt Caswell <matt@openssl.org>2016-02-09 23:29:31 +0000
commitb7326ea7106955a7a5b8190fb19c982b49b7c821 (patch)
treeffb1f036ac3f322aa3b2ea90b3344f839463287c /crypto/init.c
parent38a6d7f89a6d060b7d463cbdd15eada434bb2d69 (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/init.c')
-rw-r--r--crypto/init.c24
1 files changed, 19 insertions, 5 deletions
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;
}