From b7a7f39afeb4748b4c25dbccb8951711b8b70eaf Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 14 Nov 2016 23:53:45 +0100 Subject: [PATCH] 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 (Merged from https://github.com/openssl/openssl/pull/1922) --- crypto/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) -- 2.25.1