diff options
author | Matt Caswell <matt@openssl.org> | 2016-02-10 09:47:51 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2016-02-10 12:03:07 +0000 |
commit | deca5df2fb879aa8763c54ab230dc6da940da9d0 (patch) | |
tree | 4e43cbf77348cd7069a2be912873a36e5642dc24 /crypto/init.c | |
parent | 740b2b9a6cf31b02916a4d18f868e8a95934c083 (diff) |
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 <rsalz@openssl.org>
Diffstat (limited to 'crypto/init.c')
-rw-r--r-- | crypto/init.c | 34 |
1 files 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( |