X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Finit.c;h=d3167804d97a22c89906bd1c49df98c2511675d1;hp=44acd4f4df87e54d6aaf939f29fc739a33bf4d4b;hb=3c27208fab1dc29f47f088490404df5abfcdfb05;hpb=c292b105b1d0a627091480d3e4f6122b22a46385 diff --git a/crypto/init.c b/crypto/init.c index 44acd4f4df..d3167804d9 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -63,9 +63,7 @@ #include #include #include -#ifndef OPENSSL_NO_ENGINE #include -#endif #include #include #include @@ -236,7 +234,6 @@ static void ossl_init_async(void) #endif #ifndef OPENSSL_NO_ENGINE -static int engine_inited = 0; static CRYPTO_ONCE engine_openssl = CRYPTO_ONCE_STATIC_INIT; static void ossl_init_engine_openssl(void) { @@ -245,7 +242,6 @@ static void ossl_init_engine_openssl(void) "engine_load_openssl_internal()\n"); # endif engine_load_openssl_internal(); - engine_inited = 1; } # if !defined(OPENSSL_NO_HW) && \ (defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV)) @@ -257,7 +253,6 @@ static void ossl_init_engine_cryptodev(void) "engine_load_cryptodev_internal()\n"); # endif engine_load_cryptodev_internal(); - engine_inited = 1; } # endif @@ -270,7 +265,6 @@ static void ossl_init_engine_rdrand(void) "engine_load_rdrand_internal()\n"); # endif engine_load_rdrand_internal(); - engine_inited = 1; } # endif static CRYPTO_ONCE engine_dynamic = CRYPTO_ONCE_STATIC_INIT; @@ -281,7 +275,6 @@ static void ossl_init_engine_dynamic(void) "engine_load_dynamic_internal()\n"); # endif engine_load_dynamic_internal(); - engine_inited = 1; } # ifndef OPENSSL_NO_STATIC_ENGINE # if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK) @@ -293,7 +286,6 @@ static void ossl_init_engine_padlock(void) "engine_load_padlock_internal()\n"); # endif engine_load_padlock_internal(); - engine_inited = 1; } # endif # if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG) @@ -305,7 +297,6 @@ static void ossl_init_engine_capi(void) "engine_load_capi_internal()\n"); # endif engine_load_capi_internal(); - engine_inited = 1; } # endif static CRYPTO_ONCE engine_dasync = CRYPTO_ONCE_STATIC_INIT; @@ -316,10 +307,9 @@ static void ossl_init_engine_dasync(void) "engine_load_dasync_internal()\n"); # endif engine_load_dasync_internal(); - engine_inited = 1; } # 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 @@ -327,19 +317,21 @@ static void ossl_init_engine_afalg(void) "engine_load_afalg_internal()\n"); # endif engine_load_afalg_internal(); - engine_inited = 1; } # endif # 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) { @@ -360,9 +352,9 @@ static void ossl_init_thread_stop(struct thread_local_inits_st *locals) if (locals->err_state) { #ifdef OPENSSL_INIT_DEBUG fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: " - "ERR_remove_thread_state(NULL)\n"); + "ERR_remove_thread_state()\n"); #endif - ERR_remove_thread_state(NULL); + ERR_remove_thread_state(); } OPENSSL_free(locals); @@ -435,6 +427,7 @@ 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: " @@ -442,6 +435,7 @@ void OPENSSL_cleanup(void) #endif COMP_zlib_cleanup(); } +#endif #ifndef OPENSSL_NO_ASYNC if (async_inited) { @@ -453,16 +447,6 @@ void OPENSSL_cleanup(void) } #endif -#ifndef OPENSSL_NO_ENGINE - if (engine_inited) { -# ifdef OPENSSL_INIT_DEBUG - fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " - "ENGINE_cleanup()\n"); -# endif - ENGINE_cleanup(); - } -#endif - if (load_crypto_strings_inited) { #ifdef OPENSSL_INIT_DEBUG fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " @@ -474,19 +458,41 @@ void OPENSSL_cleanup(void) CRYPTO_THREAD_cleanup_local(&threadstopkey); #ifdef OPENSSL_INIT_DEBUG - fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " + 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_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: + * - 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 CRYPTO_cleanup_all_ex_data(); + BIO_sock_cleanup(); EVP_cleanup(); - CONF_modules_free(); - RAND_cleanup(); + OBJ_cleanup(); base_inited = 0; } @@ -586,13 +592,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) @@ -611,9 +617,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; } @@ -632,5 +640,3 @@ int OPENSSL_atexit(void (*handler)(void)) return 1; } - -