mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-30 02:37:28 +02:00
account for 'pulled' error nodes
This commit is contained in:
11
src/ssl.c
11
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;
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user