mirror of
https://github.com/openssl/openssl.git
synced 2025-01-30 14:01:55 +08:00
Fix init_thread_stop
init_thread_stop maintains a linked lists of handlers that it should call when a thread finishes. The linked list handling wasn't quite right resulting in corrupted data. Reviewed-by: Richard Levitte <levitte@openssl.org> Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/10863)
This commit is contained in:
parent
bddbfae1cd
commit
2dd04ca881
@ -297,7 +297,7 @@ void ossl_ctx_thread_stop(void *arg)
|
||||
|
||||
static void init_thread_stop(void *arg, THREAD_EVENT_HANDLER **hands)
|
||||
{
|
||||
THREAD_EVENT_HANDLER *curr, *prev = NULL;
|
||||
THREAD_EVENT_HANDLER *curr, *prev = NULL, *tmp;
|
||||
|
||||
/* Can't do much about this */
|
||||
if (hands == NULL)
|
||||
@ -306,15 +306,20 @@ static void init_thread_stop(void *arg, THREAD_EVENT_HANDLER **hands)
|
||||
curr = *hands;
|
||||
while (curr != NULL) {
|
||||
if (arg != NULL && curr->arg != arg) {
|
||||
prev = curr;
|
||||
curr = curr->next;
|
||||
continue;
|
||||
}
|
||||
curr->handfn(curr->arg);
|
||||
prev = curr;
|
||||
if (prev == NULL)
|
||||
*hands = curr->next;
|
||||
else
|
||||
prev->next = curr->next;
|
||||
|
||||
tmp = curr;
|
||||
curr = curr->next;
|
||||
if (prev == *hands)
|
||||
*hands = curr;
|
||||
OPENSSL_free(prev);
|
||||
|
||||
OPENSSL_free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user