diff options
author | Richard Levitte <levitte@openssl.org> | 2016-07-19 19:42:11 +0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2016-07-19 23:49:54 +0200 |
commit | c2e4e5d248567d4eea5bf6d525bdbcc09099ba6e (patch) | |
tree | e4e16df15de0263a21427c92ae21d20dc98e3c19 /crypto/engine | |
parent | 925d17f3ee4b7f7881fa77a31524ecd9f1305242 (diff) |
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: Kurt Roeckx <kurt@openssl.org>
Diffstat (limited to 'crypto/engine')
-rw-r--r-- | crypto/engine/eng_init.c | 5 | ||||
-rw-r--r-- | crypto/engine/eng_int.h | 3 | ||||
-rw-r--r-- | crypto/engine/eng_lib.c | 9 | ||||
-rw-r--r-- | crypto/engine/eng_list.c | 18 | ||||
-rw-r--r-- | crypto/engine/tb_asnmth.c | 6 |
5 files changed, 30 insertions, 11 deletions
diff --git a/crypto/engine/eng_init.c b/crypto/engine/eng_init.c index c51a38dac0..8be7c6fc86 100644 --- a/crypto/engine/eng_init.c +++ b/crypto/engine/eng_init.c @@ -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); diff --git a/crypto/engine/eng_int.h b/crypto/engine/eng_int.h index 6b6ff9fa4c..c604faddd7 100644 --- a/crypto/engine/eng_int.h +++ b/crypto/engine/eng_int.h @@ -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 diff --git a/crypto/engine/eng_lib.c b/crypto/engine/eng_lib.c index f7d0216efb..67d755a2aa 100644 --- a/crypto/engine/eng_lib.c +++ b/crypto/engine/eng_lib.c @@ -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; } diff --git a/crypto/engine/eng_list.c b/crypto/engine/eng_list.c index a7252e930b..934389f74e 100644 --- a/crypto/engine/eng_list.c +++ b/crypto/engine/eng_list.c @@ -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)) diff --git a/crypto/engine/tb_asnmth.c b/crypto/engine/tb_asnmth.c index 2a6a4ae95e..480267daab 100644 --- a/crypto/engine/tb_asnmth.c +++ b/crypto/engine/tb_asnmth.c @@ -189,7 +189,11 @@ const EVP_PKEY_ASN1_METHOD *ENGINE_pkey_asn1_find_str(ENGINE **pe, fstr.str = str; fstr.len = len; - 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_PKEY_ASN1_FIND_STR, ERR_R_MALLOC_FAILURE); + return NULL; + } + CRYPTO_THREAD_write_lock(global_engine_lock); engine_table_doall(pkey_asn1_meth_table, look_str_cb, &fstr); /* If found obtain a structural reference to engine */ |