X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Finit.c;h=f23227e60a6c97dd998e3e61aad304807539e855;hp=b9cc6a1f76556bb4339be10a81844263fec83bb8;hb=b7326ea7106955a7a5b8190fb19c982b49b7c821;hpb=38a6d7f89a6d060b7d463cbdd15eada434bb2d69 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; }