Adding ERR_print_errors_cb

This commit is contained in:
Eric Blankenhorn
2020-02-13 12:32:59 -06:00
parent a0ddb05a07
commit 936312f77e
5 changed files with 56 additions and 29 deletions

View File

@ -4377,6 +4377,12 @@ void wolfSSL_ERR_dump_errors_fp(XFILE fp)
{ {
wc_ERR_print_errors_fp(fp); wc_ERR_print_errors_fp(fp);
} }
void wolfSSL_ERR_print_errors_cb (int (*cb)(const char *str, size_t len,
void *u), void *u)
{
wc_ERR_print_errors_cb(cb, u);
}
#endif #endif
#endif #endif

View File

@ -782,41 +782,57 @@ int wc_ERR_remove_state(void)
return 0; return 0;
} }
#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
/* empties out the error queue into the file */ /* empties out the error queue into the file */
static int wc_ERR_dump_to_file (const char *str, size_t len, void *u)
{
XFILE fp = (XFILE ) u;
fprintf(fp, "%-*.*s\n", (int)len, (int)len, str);
return 0;
}
/* This callback allows the application to provide a custom error printing
* function. */
void wc_ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u),
void *u)
{
WOLFSSL_ENTER("wc_ERR_print_errors_cb");
if (wc_LockMutex(&debug_mutex) != 0)
{
WOLFSSL_MSG("Lock debug mutex failed");
}
else
{
/* free all nodes from error queue and print them to file */
struct wc_error_queue *current;
struct wc_error_queue *next;
current = (struct wc_error_queue *)wc_errors;
while (current != NULL)
{
next = current->next;
cb(current->error, strlen(current->error), u);
XFREE(current, current->heap, DYNAMIC_TYPE_LOG);
current = next;
}
/* set global pointers to match having been freed */
wc_errors = NULL;
wc_last_node = NULL;
wc_UnLockMutex(&debug_mutex);
}
}
void wc_ERR_print_errors_fp(XFILE fp) void wc_ERR_print_errors_fp(XFILE fp)
{ {
WOLFSSL_ENTER("wc_ERR_print_errors_fp"); WOLFSSL_ENTER("wc_ERR_print_errors_fp");
if (wc_LockMutex(&debug_mutex) != 0) /* Send all errors to the wc_ERR_dump_to_file function */
{ wc_ERR_print_errors_cb(wc_ERR_dump_to_file,fp);
WOLFSSL_MSG("Lock debug mutex failed");
}
else
{
/* free all nodes from error queue and print them to file */
{
struct wc_error_queue *current;
struct wc_error_queue *next;
current = (struct wc_error_queue *)wc_errors;
while (current != NULL)
{
next = current->next;
fprintf(fp, "%s\n", current->error);
XFREE(current, current->heap, DYNAMIC_TYPE_LOG);
current = next;
}
/* set global pointers to match having been freed */
wc_errors = NULL;
wc_last_node = NULL;
}
wc_UnLockMutex(&debug_mutex);
}
} }
#endif /* !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) */ #endif /* !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) */
#endif /* defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) */ #endif /* defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) */

View File

@ -769,6 +769,7 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_
#define ERR_get_error_line_data wolfSSL_ERR_get_error_line_data #define ERR_get_error_line_data wolfSSL_ERR_get_error_line_data
#define ERR_get_error wolfSSL_ERR_get_error #define ERR_get_error wolfSSL_ERR_get_error
#define ERR_print_errors_fp(file) wolfSSL_ERR_dump_errors_fp((file)) #define ERR_print_errors_fp(file) wolfSSL_ERR_dump_errors_fp((file))
#define ERR_print_errors_cb wolfSSL_ERR_print_errors_cb
#define ERR_print_errors wolfSSL_ERR_print_errors #define ERR_print_errors wolfSSL_ERR_print_errors
#define ERR_clear_error wolfSSL_ERR_clear_error #define ERR_clear_error wolfSSL_ERR_clear_error
#define ERR_free_strings wolfSSL_ERR_free_strings #define ERR_free_strings wolfSSL_ERR_free_strings

View File

@ -1781,6 +1781,8 @@ enum {
WOLFSSL_API void wolfSSL_ERR_print_errors_fp(XFILE, int err); WOLFSSL_API void wolfSSL_ERR_print_errors_fp(XFILE, int err);
#if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
WOLFSSL_API void wolfSSL_ERR_dump_errors_fp(XFILE fp); WOLFSSL_API void wolfSSL_ERR_dump_errors_fp(XFILE fp);
WOLFSSL_API void wolfSSL_ERR_print_errors_cb(int (*cb)(const char *str,
size_t len, void *u), void *u);
#endif #endif
#endif #endif
WOLFSSL_API void wolfSSL_ERR_print_errors(WOLFSSL_BIO *bio); WOLFSSL_API void wolfSSL_ERR_print_errors(WOLFSSL_BIO *bio);

View File

@ -115,7 +115,9 @@ WOLFSSL_API void wolfSSL_Debugging_OFF(void);
WOLFSSL_API int wc_SetLoggingHeap(void* h); WOLFSSL_API int wc_SetLoggingHeap(void* h);
WOLFSSL_API int wc_ERR_remove_state(void); WOLFSSL_API int wc_ERR_remove_state(void);
#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
WOLFSSL_API void wc_ERR_print_errors_fp(XFILE fp); WOLFSSL_API void wc_ERR_print_errors_fp(XFILE fp);
WOLFSSL_API void wc_ERR_print_errors_cb(int (*cb)(const char *str,
size_t len, void *u), void *u);
#endif #endif
#endif /* OPENSSL_EXTRA || DEBUG_WOLFSSL_VERBOSE */ #endif /* OPENSSL_EXTRA || DEBUG_WOLFSSL_VERBOSE */