Commit bf21fe93 authored by Bernd Edlinger's avatar Bernd Edlinger
Browse files

Ensure the thread keys are always allocated in the same order



Back-port of #5911
Fixes: #5899

Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/6037)
parent 5fc89c1a
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -604,7 +604,8 @@ static int addrinfo_wrap(int family, int socktype,

DEFINE_RUN_ONCE_STATIC(do_bio_lookup_init)
{
    OPENSSL_init_crypto(0, NULL);
    if (!OPENSSL_init_crypto(0, NULL))
        return 0;
    bio_lookup_lock = CRYPTO_THREAD_lock_new();
    return bio_lookup_lock != NULL;
}
+2 −1
Original line number Diff line number Diff line
@@ -18,7 +18,8 @@ CRYPTO_ONCE engine_lock_init = CRYPTO_ONCE_STATIC_INIT;

DEFINE_RUN_ONCE(do_engine_lock_init)
{
    OPENSSL_init_crypto(0, NULL);
    if (!OPENSSL_init_crypto(0, NULL))
        return 0;
    global_engine_lock = CRYPTO_THREAD_lock_new();
    return global_engine_lock != NULL;
}
+36 −4
Original line number Diff line number Diff line
@@ -254,7 +254,8 @@ static void ERR_STATE_free(ERR_STATE *s)

DEFINE_RUN_ONCE_STATIC(do_err_strings_init)
{
    OPENSSL_init_crypto(0, NULL);
    if (!OPENSSL_init_crypto(0, NULL))
        return 0;
    err_string_lock = CRYPTO_THREAD_lock_new();
    return err_string_lock != NULL;
}
@@ -653,7 +654,10 @@ DEFINE_RUN_ONCE_STATIC(err_do_init)

ERR_STATE *ERR_get_state(void)
{
    ERR_STATE *state = NULL;
    ERR_STATE *state;

    if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL))
        return NULL;

    if (!RUN_ONCE(&err_init, err_do_init))
        return NULL;
@@ -686,13 +690,41 @@ ERR_STATE *ERR_get_state(void)
    return state;
}

/*
 * err_shelve_state returns the current thread local error state
 * and freezes the error module until err_unshelve_state is called.
 */
int err_shelve_state(void **state)
{
    if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL))
        return 0;

    if (!RUN_ONCE(&err_init, err_do_init))
        return 0;

    *state = CRYPTO_THREAD_get_local(&err_thread_local);
    if (!CRYPTO_THREAD_set_local(&err_thread_local, (ERR_STATE*)-1))
        return 0;

    return 1;
}

/*
 * err_unshelve_state restores the error state that was returned
 * by err_shelve_state previously.
 */
void err_unshelve_state(void* state)
{
    if (state != (void*)-1)
        CRYPTO_THREAD_set_local(&err_thread_local, (ERR_STATE*)state);
}

int ERR_get_next_error_library(void)
{
    int ret;

    if (!RUN_ONCE(&err_string_init, do_err_strings_init)) {
    if (!RUN_ONCE(&err_string_init, do_err_strings_init))
        return 0;
    }

    CRYPTO_THREAD_write_lock(err_string_lock);
    ret = int_err_library_number++;
+2 −1
Original line number Diff line number Diff line
@@ -38,7 +38,8 @@ static CRYPTO_ONCE ex_data_init = CRYPTO_ONCE_STATIC_INIT;

DEFINE_RUN_ONCE_STATIC(do_ex_data_init)
{
    OPENSSL_init_crypto(0, NULL);
    if (!OPENSSL_init_crypto(0, NULL))
        return 0;
    ex_data_lock = CRYPTO_THREAD_lock_new();
    return ex_data_lock != NULL;
}
+1 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ int ossl_init_thread_start(uint64_t opts);
 * use".
 */
# define OPENSSL_INIT_ZLIB                   0x00010000L
# define OPENSSL_INIT_BASE_ONLY              0x00040000L

/* OPENSSL_INIT_THREAD flags */
# define OPENSSL_INIT_THREAD_ASYNC           0x01
Loading