X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Finit.c;h=3bfe4502ebbe7f7776c9cbbc67a264466831f24d;hp=1cac74193fc431eb822010a3c85457a4277c3a5d;hb=a5e3ac13d602173e2820e7f4399fa89e25db7821;hpb=9749a07a1d9488c2250e5461acec9b8da40762b0 diff --git a/crypto/init.c b/crypto/init.c index 1cac74193f..3bfe4502eb 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -58,15 +58,13 @@ #include #include #include -#include +#include #include #include #include #include -#ifndef OPENSSL_NO_ENGINE #include -#endif -#include +#include #include #include #include @@ -222,7 +220,6 @@ static void ossl_init_no_config(void) config_inited = 1; } -#ifndef OPENSSL_NO_ASYNC static CRYPTO_ONCE async = CRYPTO_ONCE_STATIC_INIT; static int async_inited = 0; static void ossl_init_async(void) @@ -233,7 +230,6 @@ static void ossl_init_async(void) async_init(); async_inited = 1; } -#endif #ifndef OPENSSL_NO_ENGINE static CRYPTO_ONCE engine_openssl = CRYPTO_ONCE_STATIC_INIT; @@ -311,7 +307,7 @@ static void ossl_init_engine_dasync(void) engine_load_dasync_internal(); } # if !defined(OPENSSL_NO_AFALGENG) -static OPENSSL_INIT_ONCE engine_afalg = OPENSSL_INIT_ONCE_STATIC_INIT; +static CRYPTO_ONCE engine_afalg = CRYPTO_ONCE_STATIC_INIT; static void ossl_init_engine_afalg(void) { # ifdef OPENSSL_INIT_DEBUG @@ -324,13 +320,16 @@ static void ossl_init_engine_afalg(void) # endif #endif +#ifndef OPENSSL_NO_COMP static CRYPTO_ONCE zlib = CRYPTO_ONCE_STATIC_INIT; + static int zlib_inited = 0; static void ossl_init_zlib(void) { /* Do nothing - we need to know about this for the later cleanup */ zlib_inited = 1; } +#endif static void ossl_init_thread_stop(struct thread_local_inits_st *locals) { @@ -338,7 +337,6 @@ static void ossl_init_thread_stop(struct thread_local_inits_st *locals) if (locals == NULL) return; -#ifndef OPENSSL_NO_ASYNC if (locals->async) { #ifdef OPENSSL_INIT_DEBUG fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: " @@ -346,7 +344,6 @@ static void ossl_init_thread_stop(struct thread_local_inits_st *locals) #endif ASYNC_cleanup_thread(); } -#endif if (locals->err_state) { #ifdef OPENSSL_INIT_DEBUG @@ -426,15 +423,16 @@ void OPENSSL_cleanup(void) * conditions for the various "*_inited" vars below. */ +#ifndef OPENSSL_NO_COMP if (zlib_inited) { #ifdef OPENSSL_INIT_DEBUG fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " - "COMP_zlib_cleanup()\n"); + "comp_zlib_cleanup_internal()\n"); #endif - COMP_zlib_cleanup(); + comp_zlib_cleanup_internal(); } +#endif -#ifndef OPENSSL_NO_ASYNC if (async_inited) { # ifdef OPENSSL_INIT_DEBUG fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " @@ -442,40 +440,55 @@ void OPENSSL_cleanup(void) # endif async_deinit(); } -#endif if (load_crypto_strings_inited) { #ifdef OPENSSL_INIT_DEBUG fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " - "ERR_free_strings()\n"); + "err_free_strings_intern()\n"); #endif - ERR_free_strings(); + err_free_strings_intern(); } CRYPTO_THREAD_cleanup_local(&threadstopkey); #ifdef OPENSSL_INIT_DEBUG + fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " + "rand_cleanup_intern()\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: " - "CRYPTO_cleanup_all_ex_data()\n"); - fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " + fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " + "crypto_cleanup_all_ex_data_intern()\n"); + 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: + * - rand_cleanup_intern 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_intern(); + CONF_modules_free(); #ifndef OPENSSL_NO_ENGINE ENGINE_cleanup(); #endif - CRYPTO_cleanup_all_ex_data(); + crypto_cleanup_all_ex_data_intern(); +#ifndef OPENSSL_NO_SOCK + BIO_sock_cleanup(); +#endif EVP_cleanup(); - CONF_modules_free(); - RAND_cleanup(); + OBJ_cleanup(); base_inited = 0; } @@ -546,11 +559,10 @@ int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings) return 0; } -#ifndef OPENSSL_NO_ASYNC if ((opts & OPENSSL_INIT_ASYNC) && !CRYPTO_THREAD_run_once(&async, ossl_init_async)) return 0; -#endif + #ifndef OPENSSL_NO_ENGINE if ((opts & OPENSSL_INIT_ENGINE_OPENSSL) && !CRYPTO_THREAD_run_once(&engine_openssl, @@ -575,13 +587,13 @@ int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings) # ifndef OPENSSL_NO_STATIC_ENGINE # if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK) if ((opts & OPENSSL_INIT_ENGINE_PADLOCK) - && CRYPTO_THREAD_run_once(&engine_padlock, - ossl_init_engine_padlock)) + && !CRYPTO_THREAD_run_once(&engine_padlock, + ossl_init_engine_padlock)) return 0; # endif # if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG) if ((opts & OPENSSL_INIT_ENGINE_CAPI) - && CRYPTO_THREAD_run_once(&engine_capi, ossl_init_engine_capi)) + && !CRYPTO_THREAD_run_once(&engine_capi, ossl_init_engine_capi)) return 0; # endif if ((opts & OPENSSL_INIT_ENGINE_DASYNC) @@ -600,9 +612,11 @@ int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings) } #endif +#ifndef OPENSSL_NO_COMP if ((opts & OPENSSL_INIT_ZLIB) - && CRYPTO_THREAD_run_once(&zlib, ossl_init_zlib)) + && !CRYPTO_THREAD_run_once(&zlib, ossl_init_zlib)) return 0; +#endif return 1; } @@ -621,5 +635,3 @@ int OPENSSL_atexit(void (*handler)(void)) return 1; } - -