Commit b7326ea7 authored by Matt Caswell's avatar Matt Caswell
Browse files

NULL the thread_local_inits_st pointer after use



After the final use of the thread_local_inits_st we should ensure it is
set to NULL, just in case OPENSSL_INIT_thread_stop gets called again and
it tries to use garbage.

Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
parent 38a6d7f8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ struct thread_local_inits_st {
    int async;
    int err_state;
};
void *ossl_init_get_thread_local(int alloc);

int ossl_init_thread_start(uint64_t opts);
/*
 * OPENSSL_INIT flags. The primary list of these is in crypto.h. Flags below
+19 −5
Original line number Diff line number Diff line
@@ -95,11 +95,19 @@ static void ossl_init_thread_stop_cleanup(void)
}

static struct thread_local_inits_st *local = NULL;
void *ossl_init_get_thread_local(int alloc)
static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc)
{
    static struct thread_local_inits_st *tmp;

    tmp = local;

    if (local == NULL && alloc)
        local = OPENSSL_zalloc(sizeof(*local));
    return local;
        tmp = local = OPENSSL_zalloc(sizeof(*local));

    if (!alloc)
        local = NULL;

    return tmp;
}

#elif defined(OPENSSL_SYS_WINDOWS)
@@ -182,7 +190,7 @@ static void ossl_init_thread_stop_cleanup(void)
    }
}

void *ossl_init_get_thread_local(int alloc)
static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc)
{
    struct thread_local_inits_st *local = TlsGetValue(threadstopkey);

@@ -190,6 +198,9 @@ void *ossl_init_get_thread_local(int alloc)
        local = OPENSSL_zalloc(sizeof *local);
        TlsSetValue(threadstopkey, local);
    }
    if (!alloc) {
        TlsSetValue(threadstopkey, NULL);
    }

    return local;
}
@@ -227,7 +238,7 @@ static void ossl_init_thread_stop_cleanup(void)
{
}

void *ossl_init_get_thread_local(int alloc)
static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc)
{
    struct thread_local_inits_st *local = pthread_getspecific(threadstopkey);

@@ -235,6 +246,9 @@ void *ossl_init_get_thread_local(int alloc)
        local = OPENSSL_zalloc(sizeof *local);
        pthread_setspecific(threadstopkey, local);
    }
    if (!alloc) {
        pthread_setspecific(threadstopkey, NULL);
    }

    return local;
}