diff options
author | Matt Caswell <matt@openssl.org> | 2016-03-14 11:34:59 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2016-03-14 11:54:37 +0100 |
commit | 58a8fc25d73d8558df25d998f85d4714fbbe74ac (patch) | |
tree | 0f85eaaf4ec51eeb7de5316feb9a1d4bb76f3fb7 /crypto/init.c | |
parent | Add some missing cleanup calls to de-init (diff) | |
download | openssl-58a8fc25d73d8558df25d998f85d4714fbbe74ac.tar.xz openssl-58a8fc25d73d8558df25d998f85d4714fbbe74ac.zip |
Fix the init cleanup order
There are internal dependencies between the various cleanup functions.
This re-orders things to try and get that right.
Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'crypto/init.c')
-rw-r--r-- | crypto/init.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/crypto/init.c b/crypto/init.c index dc15b1d83a..8cf72713cf 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -460,25 +460,34 @@ void OPENSSL_cleanup(void) CRYPTO_THREAD_cleanup_local(&threadstopkey); #ifdef OPENSSL_INIT_DEBUG + fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " + "RAND_cleanup()\n"); + fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " + "CONF_modules_free()\n"); #ifndef OPENSSL_NO_ENGINE fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " "ENGINE_cleanup()\n"); #endif - fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " + fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " "CRYPTO_cleanup_all_ex_data()\n"); - fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " + fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " + "BIO_sock_cleanup()\n"); + fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " "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_cleanup: " + "OBJ_cleanup()\n"); #endif -/* - * Note that cleanup order is important. - * For example, ENGINEs use CRYPTO_EX_DATA and therefore, must be cleaned up - * before the ex data handlers are wiped in CRYPTO_cleanup_all_ex_data(). - */ + /* + * Note that cleanup order is important: + * - RAND_cleanup could call an ENINGE's RAND cleanup function so must be + * called before ENGINE_cleanup() + * - ENGINEs use CRYPTO_EX_DATA and therefore, must be cleaned up + * before the ex data handlers are wiped in CRYPTO_cleanup_all_ex_data(). + * - CONF_modules_free() can end up in ENGINE code so must be called before + * ENGINE_cleanup() + */ + RAND_cleanup(); + CONF_modules_free(); #ifndef OPENSSL_NO_ENGINE ENGINE_cleanup(); #endif @@ -486,8 +495,6 @@ void OPENSSL_cleanup(void) BIO_sock_cleanup(); EVP_cleanup(); OBJ_cleanup(); - CONF_modules_free(); - RAND_cleanup(); base_inited = 0; } |