#include <internal/evp_int.h>
#include <internal/conf.h>
#include <internal/async.h>
-#ifndef OPENSSL_NO_ENGINE
#include <internal/engine.h>
-#endif
#include <openssl/comp.h>
#include <internal/err.h>
#include <stdlib.h>
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
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
- CRYPTO_cleanup_all_ex_data();
- EVP_cleanup();
+ /*
+ * 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
- RAND_cleanup();
+ CRYPTO_cleanup_all_ex_data();
+#ifndef OPENSSL_NO_SOCK
+ BIO_sock_cleanup();
+#endif
+ EVP_cleanup();
+ OBJ_cleanup();
base_inited = 0;
}
# 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)
#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;
}
-
-