From deca5df2fb879aa8763c54ab230dc6da940da9d0 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Wed, 10 Feb 2016 09:47:51 +0000 Subject: [PATCH 1/1] If we've not been inited don't deinit If you call an explicit deinit when we've not been inited then a seg fault can occur. We should check that we've been inited before attempting to deinit. Reviewed-by: Rich Salz --- crypto/init.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/crypto/init.c b/crypto/init.c index 26021d9494..3b55a4300f 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -537,6 +537,10 @@ void OPENSSL_INIT_library_stop(void) { OPENSSL_INIT_STOP *currhandler, *lasthandler; + /* If we've not been inited then no need to deinit */ + if (!base_inited) + return; + /* * Thread stop may not get automatically called by the thread library for * the very last thread in some situations, so call it directly. @@ -613,24 +617,22 @@ void OPENSSL_INIT_library_stop(void) OPENSSL_INIT_ONCE_DYNAMIC_INIT(&load_crypto_strings); } - if (base_inited) { #ifdef OPENSSL_INIT_DEBUG - fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " - "CRYPTO_cleanup_all_ex_data()\n"); - fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " - "EVP_cleanup()\n"); - fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " - "CONF_modules_free()\n"); - fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " - "RAND_cleanup()\n"); + fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " + "CRYPTO_cleanup_all_ex_data()\n"); + fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " + "EVP_cleanup()\n"); + fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " + "CONF_modules_free()\n"); + fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " + "RAND_cleanup()\n"); #endif - CRYPTO_cleanup_all_ex_data(); - EVP_cleanup(); - CONF_modules_free(); - RAND_cleanup(); - base_inited = 0; - OPENSSL_INIT_ONCE_DYNAMIC_INIT(&base); - } + CRYPTO_cleanup_all_ex_data(); + EVP_cleanup(); + CONF_modules_free(); + RAND_cleanup(); + base_inited = 0; + OPENSSL_INIT_ONCE_DYNAMIC_INIT(&base); } static const OPENSSL_INIT_SETTINGS *ossl_init_get_setting( -- 2.34.1