#include <openssl/bio.h>
#include <openssl/opensslconf.h>
#include "internal/thread_once.h"
+#include "internal/threads_common.h"
#include "crypto/ctype.h"
#include "internal/constant_time.h"
#include "internal/e_os.h"
};
#endif
-static CRYPTO_ONCE err_init = CRYPTO_ONCE_STATIC_INIT;
-static int set_err_thread_local;
-static CRYPTO_THREAD_LOCAL err_thread_local;
-
static CRYPTO_ONCE err_string_init = CRYPTO_ONCE_STATIC_INIT;
static CRYPTO_RWLOCK *err_string_lock = NULL;
void err_cleanup(void)
{
- if (set_err_thread_local != 0)
- CRYPTO_THREAD_cleanup_local(&err_thread_local);
CRYPTO_THREAD_lock_free(err_string_lock);
err_string_lock = NULL;
#ifndef OPENSSL_NO_ERR
static void err_delete_thread_state(void *unused)
{
- ERR_STATE *state = CRYPTO_THREAD_get_local(&err_thread_local);
+ ERR_STATE *state = CRYPTO_THREAD_get_local_ex(CRYPTO_THREAD_LOCAL_ERR_KEY, NULL);
+
if (state == NULL)
return;
- CRYPTO_THREAD_set_local(&err_thread_local, NULL);
+ CRYPTO_THREAD_set_local_ex(CRYPTO_THREAD_LOCAL_ERR_KEY, NULL, NULL);
OSSL_ERR_STATE_free(state);
}
}
#endif
-DEFINE_RUN_ONCE_STATIC(err_do_init)
-{
- set_err_thread_local = 1;
- return CRYPTO_THREAD_init_local(&err_thread_local, NULL);
-}
-
ERR_STATE *ossl_err_get_state_int(void)
{
ERR_STATE *state;
if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL))
return NULL;
- if (!RUN_ONCE(&err_init, err_do_init))
- return NULL;
-
- state = CRYPTO_THREAD_get_local(&err_thread_local);
- if (state == (ERR_STATE*)-1)
+ state = CRYPTO_THREAD_get_local_ex(CRYPTO_THREAD_LOCAL_ERR_KEY, NULL);
+ if (state == (ERR_STATE *)-1)
return NULL;
if (state == NULL) {
- if (!CRYPTO_THREAD_set_local(&err_thread_local, (ERR_STATE*)-1))
+ if (!CRYPTO_THREAD_set_local_ex(CRYPTO_THREAD_LOCAL_ERR_KEY, NULL, (ERR_STATE *)-1))
return NULL;
state = OSSL_ERR_STATE_new();
if (state == NULL) {
- CRYPTO_THREAD_set_local(&err_thread_local, NULL);
+ CRYPTO_THREAD_set_local_ex(CRYPTO_THREAD_LOCAL_ERR_KEY, NULL, NULL);
return NULL;
}
if (!ossl_init_thread_start(NULL, NULL, err_delete_thread_state)
- || !CRYPTO_THREAD_set_local(&err_thread_local, state)) {
+ || !CRYPTO_THREAD_set_local_ex(CRYPTO_THREAD_LOCAL_ERR_KEY, NULL, state)) {
OSSL_ERR_STATE_free(state);
- CRYPTO_THREAD_set_local(&err_thread_local, NULL);
+ CRYPTO_THREAD_set_local_ex(CRYPTO_THREAD_LOCAL_ERR_KEY, NULL, NULL);
return NULL;
}
if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL))
return 0;
- if (!RUN_ONCE(&err_init, err_do_init))
- return 0;
-
- *state = CRYPTO_THREAD_get_local(&err_thread_local);
- if (!CRYPTO_THREAD_set_local(&err_thread_local, (ERR_STATE*)-1))
+ *state = CRYPTO_THREAD_get_local_ex(CRYPTO_THREAD_LOCAL_ERR_KEY, NULL);
+ if (!CRYPTO_THREAD_set_local_ex(CRYPTO_THREAD_LOCAL_ERR_KEY, NULL, (ERR_STATE *)-1))
return 0;
set_sys_error(saveerrno);
void err_unshelve_state(void* state)
{
if (state != (void*)-1)
- CRYPTO_THREAD_set_local(&err_thread_local, (ERR_STATE*)state);
+ CRYPTO_THREAD_set_local_ex(CRYPTO_THREAD_LOCAL_ERR_KEY, NULL, (ERR_STATE *)state);
}
int ERR_get_next_error_library(void)