summaryrefslogtreecommitdiffstats
path: root/crypto/err
diff options
context:
space:
mode:
authorRich Salz <rsalz@openssl.org>2017-05-31 12:14:55 -0400
committerRich Salz <rsalz@openssl.org>2017-06-05 08:05:03 -0400
commitc8ec34109cab8c92685958ddfef0776a4b3b8460 (patch)
tree31794e88a15eec1cf6599f566352b9d62a01646d /crypto/err
parent3dbd32c4fe7cba6abb0e2b71313185d0a908478f (diff)
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 <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/3592) (cherry picked from commit 73bc53708c386c1ea85941d345721e23dc61c05c)
Diffstat (limited to 'crypto/err')
-rw-r--r--crypto/err/err.c5
1 files changed, 4 insertions, 1 deletions
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);
}