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/err | |
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/err')
-rw-r--r-- | crypto/err/err.c | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/crypto/err/err.c b/crypto/err/err.c index 836fac4260..ad1ccd10d0 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -18,6 +18,7 @@ #include <openssl/buffer.h> #include <openssl/bio.h> #include <openssl/opensslconf.h> +#include <internal/thread_once.h> static void err_load_strings(int lib, ERR_STRING_DATA *str); @@ -270,9 +271,10 @@ static void ERR_STATE_free(ERR_STATE *s) OPENSSL_free(s); } -static void do_err_strings_init(void) +DEFINE_RUN_ONCE_STATIC(do_err_strings_init) { err_string_lock = CRYPTO_THREAD_lock_new(); + return err_string_lock != NULL; } void err_cleanup(void) @@ -284,7 +286,7 @@ void err_cleanup(void) void ERR_load_ERR_strings(void) { #ifndef OPENSSL_NO_ERR - CRYPTO_THREAD_run_once(&err_string_init, do_err_strings_init); + RUN_ONCE(&err_string_init, do_err_strings_init); err_load_strings(0, ERR_str_libraries); err_load_strings(0, ERR_str_reasons); @@ -316,11 +318,12 @@ void ERR_load_strings(int lib, ERR_STRING_DATA *str) err_load_strings(lib, str); } -void ERR_unload_strings(int lib, ERR_STRING_DATA *str) +int ERR_unload_strings(int lib, ERR_STRING_DATA *str) { LHASH_OF(ERR_STRING_DATA) *hash; - CRYPTO_THREAD_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); hash = get_hash(0, 0); @@ -332,11 +335,14 @@ void ERR_unload_strings(int lib, ERR_STRING_DATA *str) } } CRYPTO_THREAD_unlock(err_string_lock); + + return 1; } void err_free_strings_int(void) { - CRYPTO_THREAD_run_once(&err_string_init, do_err_strings_init); + if (!RUN_ONCE(&err_string_init, do_err_strings_init)) + return; CRYPTO_THREAD_write_lock(err_string_lock); lh_ERR_STRING_DATA_free(int_error_hash); @@ -582,7 +588,9 @@ const char *ERR_lib_error_string(unsigned long e) ERR_STRING_DATA d, *p; unsigned long l; - CRYPTO_THREAD_run_once(&err_string_init, do_err_strings_init); + if (!RUN_ONCE(&err_string_init, do_err_strings_init)) { + return NULL; + } l = ERR_GET_LIB(e); d.error = ERR_PACK(l, 0, 0); @@ -595,7 +603,9 @@ const char *ERR_func_error_string(unsigned long e) ERR_STRING_DATA d, *p; unsigned long l, f; - CRYPTO_THREAD_run_once(&err_string_init, do_err_strings_init); + if (!RUN_ONCE(&err_string_init, do_err_strings_init)) { + return NULL; + } l = ERR_GET_LIB(e); f = ERR_GET_FUNC(e); @@ -609,7 +619,9 @@ const char *ERR_reason_error_string(unsigned long e) ERR_STRING_DATA d, *p = NULL; unsigned long l, r; - CRYPTO_THREAD_run_once(&err_string_init, do_err_strings_init); + if (!RUN_ONCE(&err_string_init, do_err_strings_init)) { + return NULL; + } l = ERR_GET_LIB(e); r = ERR_GET_REASON(e); @@ -644,16 +656,17 @@ void ERR_remove_state(unsigned long pid) } #endif -static void err_do_init(void) +DEFINE_RUN_ONCE_STATIC(err_do_init) { - CRYPTO_THREAD_init_local(&err_thread_local, NULL); + return CRYPTO_THREAD_init_local(&err_thread_local, NULL); } ERR_STATE *ERR_get_state(void) { ERR_STATE *state = NULL; - CRYPTO_THREAD_run_once(&err_init, err_do_init); + if (!RUN_ONCE(&err_init, err_do_init)) + return NULL; state = CRYPTO_THREAD_get_local(&err_thread_local); @@ -679,7 +692,9 @@ int ERR_get_next_error_library(void) { int ret; - CRYPTO_THREAD_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++; |