summaryrefslogtreecommitdiffstats
path: root/crypto/init.c
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2016-11-14 23:53:45 +0100
committerRichard Levitte <levitte@openssl.org>2016-11-15 01:27:26 +0100
commitb7a7f39afeb4748b4c25dbccb8951711b8b70eaf (patch)
treebe2d71166b077f37f4f001cead8ec66fd92242eb /crypto/init.c
parent1e19eacd6f68c771a23254be037adb2a5d129350 (diff)
Stop init loops
Under certain circumstances, the libcrypto init code would loop, causing a deadlock. This would typically happen if something in ossl_init_base() caused an OpenSSL error, and the error stack routines would recurse into the init code before the flag that ossl_init_base() had been run was checked. This change makes sure ossl_init_base isn't run once more of the base is initiated. Thanks to Dmitry Kostjuchenko for the idea. Fixes Github issue #1899 Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/1922)
Diffstat (limited to 'crypto/init.c')
-rw-r--r--crypto/init.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/crypto/init.c b/crypto/init.c
index e457b2dd0e..01619bc129 100644
--- a/crypto/init.c
+++ b/crypto/init.c
@@ -503,7 +503,7 @@ int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings)
return 0;
}
- if (!RUN_ONCE(&base, ossl_init_base))
+ if (!base_inited && !RUN_ONCE(&base, ossl_init_base))
return 0;
if ((opts & OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS)