diff options
author | Andy Polyakov <appro@openssl.org> | 2018-08-16 09:26:12 +0200 |
---|---|---|
committer | Andy Polyakov <appro@openssl.org> | 2018-08-22 21:46:01 +0200 |
commit | 0b1319ba94c85af9e87308e0d573d1260a802f53 (patch) | |
tree | c3b596b7aceb45eabfd3e0049a087db85c6f1770 /crypto/init.c | |
parent | man3/OBJ_nid2obj.pod: mention failure code for OBJ_create. (diff) | |
download | openssl-0b1319ba94c85af9e87308e0d573d1260a802f53.tar.xz openssl-0b1319ba94c85af9e87308e0d573d1260a802f53.zip |
crypto/init.c: improve destructor_key's portability.
It was assumed that CRYPTO_THREAD_LOCAL is universally scalar type,
which doesn't appear to hold true.
Reviewed-by: Kurt Roeckx <kurt@roeckx.be>
(Merged from https://github.com/openssl/openssl/pull/6976)
Diffstat (limited to 'crypto/init.c')
-rw-r--r-- | crypto/init.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/crypto/init.c b/crypto/init.c index 7b69927218..209d1a483d 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -44,7 +44,10 @@ static int stopped = 0; * key value and pull NULL past initialization in the first thread that * intends to use libcrypto. */ -static CRYPTO_THREAD_LOCAL destructor_key = (CRYPTO_THREAD_LOCAL)-1; +static union { + long sane; + CRYPTO_THREAD_LOCAL value; +} destructor_key = { -1 }; static void ossl_init_thread_stop(struct thread_local_inits_st *locals); @@ -56,17 +59,17 @@ static void ossl_init_thread_destructor(void *local) static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc) { struct thread_local_inits_st *local = - CRYPTO_THREAD_get_local(&destructor_key); + CRYPTO_THREAD_get_local(&destructor_key.value); if (alloc) { if (local == NULL && (local = OPENSSL_zalloc(sizeof(*local))) != NULL - && !CRYPTO_THREAD_set_local(&destructor_key, local)) { + && !CRYPTO_THREAD_set_local(&destructor_key.value, local)) { OPENSSL_free(local); return NULL; } } else { - CRYPTO_THREAD_set_local(&destructor_key, NULL); + CRYPTO_THREAD_set_local(&destructor_key.value, NULL); } return local; @@ -103,7 +106,7 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_base) #endif OPENSSL_cpuid_setup(); - destructor_key = key; + destructor_key.value = key; base_inited = 1; return 1; @@ -409,7 +412,7 @@ static void ossl_init_thread_stop(struct thread_local_inits_st *locals) void OPENSSL_thread_stop(void) { - if (destructor_key != (CRYPTO_THREAD_LOCAL)-1) + if (destructor_key.sane != -1) ossl_init_thread_stop(ossl_init_get_thread_local(0)); } @@ -515,8 +518,8 @@ void OPENSSL_cleanup(void) err_free_strings_int(); } - key = destructor_key; - destructor_key = (CRYPTO_THREAD_LOCAL)-1; + key = destructor_key.value; + destructor_key.sane = -1; CRYPTO_THREAD_cleanup_local(&key); #ifdef OPENSSL_INIT_DEBUG |