Commit c2e4e5d2 authored by Richard Levitte's avatar Richard Levitte
Browse files

Change all our uses of CRYPTO_THREAD_run_once to use RUN_ONCE instead



That way, we have a way to check if the init function was successful
or not.

Reviewed-by: default avatarKurt Roeckx <kurt@openssl.org>
parent 925d17f3
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#ifndef OPENSSL_NO_SOCK
#include <openssl/err.h>
#include <openssl/buffer.h>
#include <internal/thread_once.h>
#include <ctype.h>

CRYPTO_RWLOCK *bio_lookup_lock;
@@ -601,9 +602,10 @@ static int addrinfo_wrap(int family, int socktype,
    return 1;
}

static void do_bio_lookup_init(void)
DEFINE_RUN_ONCE_STATIC(do_bio_lookup_init)
{
    bio_lookup_lock = CRYPTO_THREAD_lock_new();
    return (bio_lookup_lock != NULL);
}

/*-
@@ -727,7 +729,11 @@ int BIO_lookup(const char *host, const char *service,
        struct servent se_fallback = { NULL, NULL, 0, NULL };
#endif

        CRYPTO_THREAD_run_once(&bio_lookup_init, do_bio_lookup_init);
        if (!RUN_ONCE(&bio_lookup_init, do_bio_lookup_init)) {
            BIOerr(BIO_F_BIO_LOOKUP, ERR_R_MALLOC_FAILURE);
            ret = 0;
            goto err;
        }

        CRYPTO_THREAD_write_lock(bio_lookup_lock);
        he_fallback_address = INADDR_ANY;
+4 −1
Original line number Diff line number Diff line
@@ -80,7 +80,10 @@ int ENGINE_init(ENGINE *e)
        ENGINEerr(ENGINE_F_ENGINE_INIT, ERR_R_PASSED_NULL_PARAMETER);
        return 0;
    }
    CRYPTO_THREAD_run_once(&engine_lock_init, do_engine_lock_init);
    if (!RUN_ONCE(&engine_lock_init, do_engine_lock_init)) {
        ENGINEerr(ENGINE_F_ENGINE_INIT, ERR_R_MALLOC_FAILURE);
        return 0;
    }
    CRYPTO_THREAD_write_lock(global_engine_lock);
    ret = engine_unlocked_init(e);
    CRYPTO_THREAD_unlock(global_engine_lock);
+2 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

# include "internal/cryptlib.h"
# include <internal/engine.h>
# include <internal/thread_once.h>

#ifdef  __cplusplus
extern "C" {
@@ -123,7 +124,7 @@ void engine_pkey_asn1_meths_free(ENGINE *e);

/* Once initialisation function */
extern CRYPTO_ONCE engine_lock_init;
void do_engine_lock_init(void);
DECLARE_RUN_ONCE(do_engine_lock_init)

/*
 * This is a structure for storing implementations of various crypto
+4 −5
Original line number Diff line number Diff line
@@ -16,19 +16,18 @@ CRYPTO_ONCE engine_lock_init = CRYPTO_ONCE_STATIC_INIT;

/* The "new"/"free" stuff first */

void do_engine_lock_init(void)
DEFINE_RUN_ONCE(do_engine_lock_init)
{
    global_engine_lock = CRYPTO_THREAD_lock_new();
    return global_engine_lock != NULL;
}

ENGINE *ENGINE_new(void)
{
    ENGINE *ret;

    CRYPTO_THREAD_run_once(&engine_lock_init, do_engine_lock_init);

    ret = OPENSSL_zalloc(sizeof(*ret));
    if (ret == NULL) {
    if (!RUN_ONCE(&engine_lock_init, do_engine_lock_init)
        || (ret = OPENSSL_zalloc(sizeof(*ret))) == NULL) {
        ENGINEerr(ENGINE_F_ENGINE_NEW, ERR_R_MALLOC_FAILURE);
        return NULL;
    }
+15 −3
Original line number Diff line number Diff line
@@ -136,7 +136,11 @@ ENGINE *ENGINE_get_first(void)
{
    ENGINE *ret;

    CRYPTO_THREAD_run_once(&engine_lock_init, do_engine_lock_init);
    if (!RUN_ONCE(&engine_lock_init, do_engine_lock_init)) {
        ENGINEerr(ENGINE_F_ENGINE_GET_FIRST, ERR_R_MALLOC_FAILURE);
        return NULL;
    }

    CRYPTO_THREAD_write_lock(global_engine_lock);
    ret = engine_list_head;
    if (ret) {
@@ -151,7 +155,11 @@ ENGINE *ENGINE_get_last(void)
{
    ENGINE *ret;

    CRYPTO_THREAD_run_once(&engine_lock_init, do_engine_lock_init);
    if (!RUN_ONCE(&engine_lock_init, do_engine_lock_init)) {
        ENGINEerr(ENGINE_F_ENGINE_GET_LAST, ERR_R_MALLOC_FAILURE);
        return NULL;
    }

    CRYPTO_THREAD_write_lock(global_engine_lock);
    ret = engine_list_tail;
    if (ret) {
@@ -279,7 +287,11 @@ ENGINE *ENGINE_by_id(const char *id)
        ENGINEerr(ENGINE_F_ENGINE_BY_ID, ERR_R_PASSED_NULL_PARAMETER);
        return NULL;
    }
    CRYPTO_THREAD_run_once(&engine_lock_init, do_engine_lock_init);
    if (!RUN_ONCE(&engine_lock_init, do_engine_lock_init)) {
        ENGINEerr(ENGINE_F_ENGINE_BY_ID, ERR_R_MALLOC_FAILURE);
        return NULL;
    }

    CRYPTO_THREAD_write_lock(global_engine_lock);
    iterator = engine_list_head;
    while (iterator && (strcmp(id, iterator->id) != 0))
Loading