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>
This commit is contained in:
Matt Caswell 2016-02-10 09:47:51 +00:00
parent 740b2b9a6c
commit deca5df2fb

View File

@ -537,6 +537,10 @@ void OPENSSL_INIT_library_stop(void)
{ {
OPENSSL_INIT_STOP *currhandler, *lasthandler; 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 * Thread stop may not get automatically called by the thread library for
* the very last thread in some situations, so call it directly. * 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); OPENSSL_INIT_ONCE_DYNAMIC_INIT(&load_crypto_strings);
} }
if (base_inited) {
#ifdef OPENSSL_INIT_DEBUG #ifdef OPENSSL_INIT_DEBUG
fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: "
"CRYPTO_cleanup_all_ex_data()\n"); "CRYPTO_cleanup_all_ex_data()\n");
fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: "
"EVP_cleanup()\n"); "EVP_cleanup()\n");
fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: "
"CONF_modules_free()\n"); "CONF_modules_free()\n");
fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: "
"RAND_cleanup()\n"); "RAND_cleanup()\n");
#endif #endif
CRYPTO_cleanup_all_ex_data(); CRYPTO_cleanup_all_ex_data();
EVP_cleanup(); EVP_cleanup();
CONF_modules_free(); CONF_modules_free();
RAND_cleanup(); RAND_cleanup();
base_inited = 0; base_inited = 0;
OPENSSL_INIT_ONCE_DYNAMIC_INIT(&base); OPENSSL_INIT_ONCE_DYNAMIC_INIT(&base);
}
} }
static const OPENSSL_INIT_SETTINGS *ossl_init_get_setting( static const OPENSSL_INIT_SETTINGS *ossl_init_get_setting(