From: Rich Salz Date: Wed, 31 May 2017 16:14:55 +0000 (-0400) Subject: Only release thread-local key if we created it. X-Git-Tag: OpenSSL_1_1_0g~192 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=c8ec34109cab8c92685958ddfef0776a4b3b8460;p=oweals%2Fopenssl.git Only release thread-local key if we created it. Thanks to Jan Alexander Steffens for finding the bug and confirming the fix. Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/3592) (cherry picked from commit 73bc53708c386c1ea85941d345721e23dc61c05c) --- diff --git a/crypto/err/err.c b/crypto/err/err.c index f866f2fdd0..c55f849590 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -122,6 +122,7 @@ static ERR_STRING_DATA ERR_str_reasons[] = { #endif static CRYPTO_ONCE err_init = CRYPTO_ONCE_STATIC_INIT; +static int set_err_thread_local; static CRYPTO_THREAD_LOCAL err_thread_local; static CRYPTO_ONCE err_string_init = CRYPTO_ONCE_STATIC_INIT; @@ -260,7 +261,8 @@ DEFINE_RUN_ONCE_STATIC(do_err_strings_init) void err_cleanup(void) { - CRYPTO_THREAD_cleanup_local(&err_thread_local); + if (set_err_thread_local != 0) + CRYPTO_THREAD_cleanup_local(&err_thread_local); CRYPTO_THREAD_lock_free(err_string_lock); err_string_lock = NULL; } @@ -639,6 +641,7 @@ void ERR_remove_state(unsigned long pid) DEFINE_RUN_ONCE_STATIC(err_do_init) { + set_err_thread_local = 1; return CRYPTO_THREAD_init_local(&err_thread_local, NULL); }