Commit 1eeb882e authored by Bernd Edlinger's avatar Bernd Edlinger
Browse files

Backport of commit 6b49b308



Prevent a possible recursion in ERR_get_state and fix the problem that
was pointed out in commit aef84bb4
differently.

Fixes: #6493

Reviewed-by: default avatarMatt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/6494)
parent 0c27d793
Loading
Loading
Loading
Loading
+10 −11
Original line number Diff line number Diff line
@@ -662,24 +662,23 @@ ERR_STATE *ERR_get_state(void)
    if (!RUN_ONCE(&err_init, err_do_init))
        return NULL;

    /*
     * If base OPENSSL_init_crypto() hasn't been called yet, be sure to call
     * it now to avoid state to be doubly allocated and thereby leak memory.
     * Needed on any platform that doesn't define OPENSSL_USE_NODELETE.
     */
    if (!OPENSSL_init_crypto(0, NULL))
        return NULL;

    state = CRYPTO_THREAD_get_local(&err_thread_local);
    if (state == (ERR_STATE*)-1)
        return NULL;

    if (state == NULL) {
        state = OPENSSL_zalloc(sizeof(*state));
        if (state == NULL)
        if (!CRYPTO_THREAD_set_local(&err_thread_local, (ERR_STATE*)-1))
            return NULL;

        if ((state = OPENSSL_zalloc(sizeof(*state))) == NULL) {
            CRYPTO_THREAD_set_local(&err_thread_local, NULL);
            return NULL;
        }

        if (!ossl_init_thread_start(OPENSSL_INIT_THREAD_ERR_STATE)
                || !CRYPTO_THREAD_set_local(&err_thread_local, state)) {
            ERR_STATE_free(state);
            CRYPTO_THREAD_set_local(&err_thread_local, NULL);
            return NULL;
        }