Commit 58a8fc25 authored by Matt Caswell's avatar Matt Caswell
Browse files

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: default avatarRichard Levitte <levitte@openssl.org>
parent b10cdcce
Loading
Loading
Loading
Loading
+21 −14
Original line number Diff line number Diff line
@@ -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
     * 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;
}