#include "internal/constant_time.h"
#include "e_os.h"
+#ifndef OPENSSL_NO_ERR
static int err_load_strings(const ERR_STRING_DATA *str);
+#endif
static void ERR_STATE_free(ERR_STATE *s);
#ifndef OPENSSL_NO_ERR
static CRYPTO_THREAD_LOCAL err_thread_local;
static CRYPTO_ONCE err_string_init = CRYPTO_ONCE_STATIC_INIT;
-static CRYPTO_RWLOCK *err_string_lock;
+static CRYPTO_RWLOCK *err_string_lock = NULL;
+#ifndef OPENSSL_NO_ERR
static ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *);
+#endif
/*
* The internal state
*/
+#ifndef OPENSSL_NO_ERR
static LHASH_OF(ERR_STRING_DATA) *int_error_hash = NULL;
+#endif
static int int_err_library_number = ERR_LIB_USER;
static unsigned long get_error_values(int inc, int top, const char **file,
int *line, const char **data,
int *flags);
+#ifndef OPENSSL_NO_ERR
static unsigned long err_string_data_hash(const ERR_STRING_DATA *a)
{
unsigned long ret, l;
return p;
}
-#ifndef OPENSSL_NO_ERR
/* 2019-05-21: Russian and Ukrainian locales on Linux require more than 6,5 kB */
# define SPACE_SYS_STR_REASONS 8 * 1024
# define NUM_SYS_STR_REASONS 127
err_string_lock = CRYPTO_THREAD_lock_new();
if (err_string_lock == NULL)
return 0;
+#ifndef OPENSSL_NO_ERR
int_error_hash = lh_ERR_STRING_DATA_new(err_string_data_hash,
err_string_data_cmp);
if (int_error_hash == NULL) {
err_string_lock = NULL;
return 0;
}
+#endif
return 1;
}
CRYPTO_THREAD_cleanup_local(&err_thread_local);
CRYPTO_THREAD_lock_free(err_string_lock);
err_string_lock = NULL;
+#ifndef OPENSSL_NO_ERR
lh_ERR_STRING_DATA_free(int_error_hash);
int_error_hash = NULL;
+#endif
}
+#ifndef OPENSSL_NO_ERR
/*
* Legacy; pack in the library.
*/
CRYPTO_THREAD_unlock(err_string_lock);
return 1;
}
+#endif
int ERR_load_ERR_strings(void)
{
int ERR_load_strings(int lib, ERR_STRING_DATA *str)
{
+#ifndef OPENSSL_NO_ERR
if (ERR_load_ERR_strings() == 0)
return 0;
err_patch(lib, str);
err_load_strings(str);
+#endif
+
return 1;
}
int ERR_load_strings_const(const ERR_STRING_DATA *str)
{
+#ifndef OPENSSL_NO_ERR
if (ERR_load_ERR_strings() == 0)
return 0;
err_load_strings(str);
+#endif
+
return 1;
}
int ERR_unload_strings(int lib, ERR_STRING_DATA *str)
{
+#ifndef OPENSSL_NO_ERR
if (!RUN_ONCE(&err_string_init, do_err_strings_init))
return 0;
for (; str->error; str++)
(void)lh_ERR_STRING_DATA_delete(int_error_hash, str);
CRYPTO_THREAD_unlock(err_string_lock);
+#endif
return 1;
}
const char *ERR_lib_error_string(unsigned long e)
{
+#ifndef OPENSSL_NO_ERR
ERR_STRING_DATA d, *p;
unsigned long l;
d.error = ERR_PACK(l, 0, 0);
p = int_err_get_item(&d);
return ((p == NULL) ? NULL : p->string);
+#else
+ return NULL;
+#endif
}
const char *ERR_func_error_string(unsigned long e)
{
+#ifndef OPENSSL_NO_ERR
ERR_STRING_DATA d, *p;
unsigned long l, f;
d.error = ERR_PACK(l, f, 0);
p = int_err_get_item(&d);
return ((p == NULL) ? NULL : p->string);
+#else
+ return NULL;
+#endif
}
const char *ERR_reason_error_string(unsigned long e)
{
+#ifndef OPENSSL_NO_ERR
ERR_STRING_DATA d, *p = NULL;
unsigned long l, r;
p = int_err_get_item(&d);
}
return ((p == NULL) ? NULL : p->string);
+#else
+ return NULL;
+#endif
}
void err_delete_thread_state(void)