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>
diff --git a/crypto/err/err.c b/crypto/err/err.c
index 836fac4..ad1ccd1 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 @@
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_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 @@
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 @@
}
}
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 @@
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 @@
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 @@
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 @@
}
#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 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++;