* https://www.openssl.org/source/license.html
*/
+/* TODO: When ERR_STATE becomes opaque, this musts be removed */
+#define OSSL_FORCE_ERR_STATE
+
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include "e_os.h"
#include "err_locl.h"
+/* Forward declaration in case it's not published because of configuration */
+ERR_STATE *ERR_get_state(void);
+
static int err_load_strings(const ERR_STRING_DATA *str);
static void ERR_STATE_free(ERR_STATE *s);
{ERR_PACK(ERR_LIB_HMAC, 0, 0), "HMAC routines"},
{ERR_PACK(ERR_LIB_CT, 0, 0), "CT routines"},
{ERR_PACK(ERR_LIB_ASYNC, 0, 0), "ASYNC routines"},
- {ERR_PACK(ERR_LIB_KDF, 0, 0), "KDF routines"},
{ERR_PACK(ERR_LIB_OSSL_STORE, 0, 0), "STORE routines"},
{ERR_PACK(ERR_LIB_SM2, 0, 0), "SM2 routines"},
{ERR_PACK(ERR_LIB_ESS, 0, 0), "ESS routines"},
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);
+ int *line, const char **func,
+ const char **data, int *flags);
static unsigned long err_string_data_hash(const ERR_STRING_DATA *a)
{
int i;
ERR_STATE *es;
- es = ERR_get_state();
+ es = err_get_state_int();
if (es == NULL)
return;
unsigned long ERR_get_error(void)
{
- return get_error_values(1, 0, NULL, NULL, NULL, NULL);
+ return get_error_values(1, 0, NULL, NULL, NULL, NULL, NULL);
}
unsigned long ERR_get_error_line(const char **file, int *line)
{
- return get_error_values(1, 0, file, line, NULL, NULL);
+ return get_error_values(1, 0, file, line, NULL, NULL, NULL);
+}
+
+unsigned long ERR_get_error_func(const char **func)
+{
+ return get_error_values(1, 0, NULL, NULL, func, NULL, NULL);
+}
+
+unsigned long ERR_get_error_data(const char **data, int *flags)
+{
+ return get_error_values(1, 0, NULL, NULL, NULL, data, flags);
+}
+
+unsigned long ERR_get_error_all(const char **file, int *line,
+ const char **func,
+ const char **data, int *flags)
+{
+ return get_error_values(1, 0, file, line, func, data, flags);
}
+#if !OPENSSL_API_3
unsigned long ERR_get_error_line_data(const char **file, int *line,
const char **data, int *flags)
{
- return get_error_values(1, 0, file, line, data, flags);
+ return get_error_values(1, 0, file, line, NULL, data, flags);
}
+#endif
unsigned long ERR_peek_error(void)
{
- return get_error_values(0, 0, NULL, NULL, NULL, NULL);
+ return get_error_values(0, 0, NULL, NULL, NULL, NULL, NULL);
}
unsigned long ERR_peek_error_line(const char **file, int *line)
{
- return get_error_values(0, 0, file, line, NULL, NULL);
+ return get_error_values(0, 0, file, line, NULL, NULL, NULL);
}
+unsigned long ERR_peek_error_func(const char **func)
+{
+ return get_error_values(0, 0, NULL, NULL, func, NULL, NULL);
+}
+
+unsigned long ERR_peek_error_data(const char **data, int *flags)
+{
+ return get_error_values(0, 0, NULL, NULL, NULL, data, flags);
+}
+
+unsigned long ERR_peek_error_all(const char **file, int *line,
+ const char **func,
+ const char **data, int *flags)
+{
+ return get_error_values(0, 0, file, line, func, data, flags);
+}
+
+#if !OPENSSL_API_3
unsigned long ERR_peek_error_line_data(const char **file, int *line,
const char **data, int *flags)
{
- return get_error_values(0, 0, file, line, data, flags);
+ return get_error_values(0, 0, file, line, NULL, data, flags);
}
+#endif
unsigned long ERR_peek_last_error(void)
{
- return get_error_values(0, 1, NULL, NULL, NULL, NULL);
+ return get_error_values(0, 1, NULL, NULL, NULL, NULL, NULL);
}
unsigned long ERR_peek_last_error_line(const char **file, int *line)
{
- return get_error_values(0, 1, file, line, NULL, NULL);
+ return get_error_values(0, 1, file, line, NULL, NULL, NULL);
+}
+
+unsigned long ERR_peek_last_error_func(const char **func)
+{
+ return get_error_values(0, 1, NULL, NULL, func, NULL, NULL);
+}
+
+unsigned long ERR_peek_last_error_data(const char **data, int *flags)
+{
+ return get_error_values(0, 1, NULL, NULL, NULL, data, flags);
+}
+
+unsigned long ERR_peek_last_error_all(const char **file, int *line,
+ const char **func,
+ const char **data, int *flags)
+{
+ return get_error_values(0, 1, file, line, func, data, flags);
}
+#if !OPENSSL_API_3
unsigned long ERR_peek_last_error_line_data(const char **file, int *line,
const char **data, int *flags)
{
- return get_error_values(0, 1, file, line, data, flags);
+ return get_error_values(0, 1, file, line, NULL, data, flags);
}
+#endif
static unsigned long get_error_values(int inc, int top, const char **file,
- int *line, const char **data,
- int *flags)
+ int *line, const char **func,
+ const char **data, int *flags)
{
int i = 0;
ERR_STATE *es;
unsigned long ret;
- es = ERR_get_state();
+ es = err_get_state_int();
if (es == NULL)
return 0;
if (inc && top) {
- if (file)
+ if (file != NULL)
*file = "";
- if (line)
+ if (line != NULL)
*line = 0;
- if (data)
+ if (func != NULL)
+ *func = "";
+ if (data != NULL)
*data = "";
- if (flags)
+ if (flags != NULL)
*flags = 0;
return ERR_R_INTERNAL_ERROR;
}
}
+ if (func != NULL) {
+ *func = es->err_func[i];
+ if (*func == NULL)
+ *func = "N/A";
+ }
+
if (data == NULL) {
if (inc) {
err_clear_data(es, i, 0);
return ((p == NULL) ? NULL : p->string);
}
+#if !OPENSSL_API_3
const char *ERR_func_error_string(unsigned long e)
{
- if (!RUN_ONCE(&err_string_init, do_err_strings_init))
- return NULL;
- return ERR_GET_LIB(e) == ERR_LIB_SYS ? "system library" : NULL;
+ return NULL;
}
+#endif
const char *ERR_reason_error_string(unsigned long e)
{
return CRYPTO_THREAD_init_local(&err_thread_local, NULL);
}
-ERR_STATE *ERR_get_state(void)
+ERR_STATE *err_get_state_int(void)
{
ERR_STATE *state;
int saveerrno = get_last_sys_error();
return state;
}
+#if !OPENSSL_API_3
+ERR_STATE *ERR_get_state(void)
+{
+ return err_get_state_int();
+}
+#endif
+
+
/*
* err_shelve_state returns the current thread local error state
* and freezes the error module until err_unshelve_state is called.
{
ERR_STATE *es;
- es = ERR_get_state();
+ es = err_get_state_int();
if (es == NULL)
return 0;
ERR_STATE *es;
/* Get the current error data; if an allocated string get it. */
- es = ERR_get_state();
+ es = err_get_state_int();
if (es == NULL)
return;
i = es->top;
}
len = strlen(str);
- for (len = 0; --num >= 0; ) {
+ while (--num >= 0) {
arg = va_arg(args, char *);
if (arg == NULL)
arg = "<NULL>";
len += strlen(arg);
- if (len > size) {
+ if (len >= size) {
char *p;
size = len + 20;
- p = OPENSSL_realloc(str, size + 1);
+ p = OPENSSL_realloc(str, size);
if (p == NULL) {
OPENSSL_free(str);
return;
}
str = p;
}
- OPENSSL_strlcat(str, arg, (size_t)size + 1);
+ OPENSSL_strlcat(str, arg, (size_t)size);
}
if (!err_set_error_data_int(str, size, flags, 0))
OPENSSL_free(str);
{
ERR_STATE *es;
- es = ERR_get_state();
+ es = err_get_state_int();
if (es == NULL)
return 0;
{
ERR_STATE *es;
- es = ERR_get_state();
+ es = err_get_state_int();
if (es == NULL)
return 0;
ERR_STATE *es;
int top;
- es = ERR_get_state();
+ es = err_get_state_int();
if (es == NULL)
return 0;
ERR_STATE *es;
int top;
- es = ERR_get_state();
+ es = err_get_state_int();
if (es == NULL)
return;