From 4daa09c3e500533b22fd577ce3c3cd1b230aa651 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 7 Sep 2021 13:42:07 +0200 Subject: [PATCH] Fixed missing checks for queue functions --- winpr/libwinpr/utils/collections/MessageQueue.c | 3 ++- winpr/libwinpr/utils/collections/Queue.c | 14 +++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/winpr/libwinpr/utils/collections/MessageQueue.c b/winpr/libwinpr/utils/collections/MessageQueue.c index fc9469721..4022e7606 100644 --- a/winpr/libwinpr/utils/collections/MessageQueue.c +++ b/winpr/libwinpr/utils/collections/MessageQueue.c @@ -268,7 +268,8 @@ void MessageQueue_Free(wMessageQueue* queue) if (!queue) return; - MessageQueue_Clear(queue); + if (queue->event) + MessageQueue_Clear(queue); CloseHandle(queue->event); DeleteCriticalSection(&queue->lock); diff --git a/winpr/libwinpr/utils/collections/Queue.c b/winpr/libwinpr/utils/collections/Queue.c index 92a3bcd32..bb1e27fa9 100644 --- a/winpr/libwinpr/utils/collections/Queue.c +++ b/winpr/libwinpr/utils/collections/Queue.c @@ -40,6 +40,7 @@ struct _wQueue HANDLE event; wObject object; + BOOL haveLock; }; /** @@ -283,6 +284,9 @@ wQueue* Queue_New(BOOL synchronized, SSIZE_T capacity, SSIZE_T growthFactor) if (capacity <= 0) capacity = 32; + if (!InitializeCriticalSectionAndSpinCount(&queue->lock, 4000)) + goto fail; + queue->haveLock = TRUE; if (!Queue_EnsureCapacity(queue, (size_t)capacity)) goto fail; @@ -291,9 +295,6 @@ wQueue* Queue_New(BOOL synchronized, SSIZE_T capacity, SSIZE_T growthFactor) if (!queue->event) goto fail; - if (!InitializeCriticalSectionAndSpinCount(&queue->lock, 4000)) - goto fail; - obj = Queue_Object(queue); obj->fnObjectEquals = default_queue_equals; @@ -308,9 +309,12 @@ void Queue_Free(wQueue* queue) if (!queue) return; - Queue_Clear(queue); + if (queue->haveLock) + { + Queue_Clear(queue); + DeleteCriticalSection(&queue->lock); + } CloseHandle(queue->event); - DeleteCriticalSection(&queue->lock); free(queue->array); free(queue); }