diff --git a/src/ssl.c b/src/ssl.c index 063ce9752..deab93ea9 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -17075,7 +17075,11 @@ cleanup: } } else { - wc_RemoveErrorNode(0); + int idx = wc_GetCurrentIdx(); + if (idx > 0) { + idx = idx -1; + } + wc_RemoveErrorNode(idx); } return ret; @@ -33241,9 +33245,10 @@ unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line, #ifdef WOLFSSL_HAVE_ERROR_QUEUE { int ret = 0; + int idx = wc_GetCurrentIdx(); while (1) { - ret = wc_PeekErrorNode(0, file, NULL, line); + ret = wc_PeekErrorNode(idx, file, NULL, line); if (ret == BAD_MUTEX_E || ret == BAD_FUNC_ARG || ret == BAD_STATE_E) { WOLFSSL_MSG("Issue peeking at error node in queue"); return 0; @@ -33270,7 +33275,7 @@ unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line, ret != -SOCKET_PEER_CLOSED_E && ret != -SOCKET_ERROR_E) break; - wc_RemoveErrorNode(0); + wc_RemoveErrorNode(idx); } return (unsigned long)ret; diff --git a/tests/api.c b/tests/api.c index 9a8127dc6..b077d707a 100644 --- a/tests/api.c +++ b/tests/api.c @@ -39821,7 +39821,7 @@ static int test_wolfSSL_ERR_put_error(void) ERR_put_error(0,SYS_F_SOCKET, 15, "this file", 15); AssertIntEQ(ERR_get_error_line(&file, &line), 15); -#ifdef WOLFSSL_PYTHON +#if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON) ERR_put_error(ERR_LIB_ASN1, SYS_F_ACCEPT, ASN1_R_HEADER_TOO_LONG, "this file", 100); AssertIntEQ(wolfSSL_ERR_peek_last_error_line(&file, &line), diff --git a/wolfcrypt/src/logging.c b/wolfcrypt/src/logging.c index e5247b8f1..02d89cef5 100644 --- a/wolfcrypt/src/logging.c +++ b/wolfcrypt/src/logging.c @@ -597,8 +597,9 @@ int wc_LoggingCleanup(void) /* peek at an error node * - * idx : if -1 then the most recent node is looked at, otherwise search - * through queue for node at the given index + * idx : if -1 then the most recent node is looked at, + * otherwise search through queue for node at the given index starting + * from the absolute head wc_errors * file : pointer to internal file string * reason : pointer to internal error reason * line : line number that error happened at @@ -811,9 +812,32 @@ int wc_AddErrorNode(int error, int line, char* buf, char* file) #endif } +/* returns the current index into the queue, can be greater than zero in cases + * where wc_PullErrorNode() has been callded. */ +int wc_GetCurrentIdx() +{ + int ret = 0; +#ifdef WOLFSSL_HAVE_ERROR_QUEUE + struct wc_error_queue* current; + + current = (struct wc_error_queue*)wc_errors; + while (current != wc_current_node && current != NULL) { + current = current->next; + ret++; + } + + /* wc_current_node was not found in the list! use index 0 */ + if (current == NULL) { + ret = 0; + } +#endif + return ret; +} + /* Removes the error node at the specified index. - * idx : if -1 then the most recent node is looked at, otherwise search - * through queue for node at the given index + * idx : if -1 then the most recent node is looked at, + * otherwise search through queue for node at the given index starting + * from the absolute head wc_errors */ void wc_RemoveErrorNode(int idx) { @@ -825,8 +849,9 @@ void wc_RemoveErrorNode(int idx) return; } - if (idx == -1) + if (idx == -1) { current = wc_last_node; + } else { current = (struct wc_error_queue*)wc_errors; for (; current != NULL && idx > 0; idx--) @@ -845,6 +870,13 @@ void wc_RemoveErrorNode(int idx) wc_current_node = current->next; XFREE(current, current->heap, DYNAMIC_TYPE_LOG); wc_error_queue_count--; + + /* last node left in list was free'd, reset list head */ + if (wc_error_queue_count == 0) { + wc_errors = NULL; + wc_last_node = NULL; + wc_current_node = NULL; + } } wc_UnLockMutex(&debug_mutex); @@ -865,7 +897,8 @@ void wc_ClearErrorNodes(void) return; } - /* free all nodes from error queue */ + /* free all nodes from error queue (even previously 'pulled' ones) starting + * at the lists absolute head of wc_errors */ { struct wc_error_queue* current; struct wc_error_queue* next; diff --git a/wolfssl/wolfcrypt/logging.h b/wolfssl/wolfcrypt/logging.h index 66518e137..320471d12 100644 --- a/wolfssl/wolfcrypt/logging.h +++ b/wolfssl/wolfcrypt/logging.h @@ -122,6 +122,7 @@ WOLFSSL_API void wolfSSL_Debugging_OFF(void); WOLFSSL_LOCAL void wc_ClearErrorNodes(void); WOLFSSL_LOCAL int wc_PullErrorNode(const char **file, const char **reason, int *line); + WOLFSSL_LOCAL int wc_GetCurrentIdx(void); WOLFSSL_API int wc_SetLoggingHeap(void* h); WOLFSSL_API int wc_ERR_remove_state(void); #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)