diff --git a/winpr/libwinpr/utils/collections/MessageQueue.c b/winpr/libwinpr/utils/collections/MessageQueue.c index e902562d9..d49d2161f 100644 --- a/winpr/libwinpr/utils/collections/MessageQueue.c +++ b/winpr/libwinpr/utils/collections/MessageQueue.c @@ -86,9 +86,10 @@ BOOL MessageQueue_Dispatch(wMessageQueue* queue, wMessage* message) goto out; queue->array = new_arr; queue->capacity = new_capacity; - ZeroMemory(&(queue->array[old_capacity]), old_capacity * sizeof(wMessage)); + ZeroMemory(&(queue->array[old_capacity]), (new_capacity - old_capacity) * sizeof(wMessage)); - if (queue->tail < old_capacity) + /* rearrange wrapped entries */ + if (queue->tail <= queue->head) { CopyMemory(&(queue->array[old_capacity]), queue->array, queue->tail * sizeof(wMessage)); queue->tail += old_capacity; diff --git a/winpr/libwinpr/utils/collections/Queue.c b/winpr/libwinpr/utils/collections/Queue.c index 37c0aa167..d6f8d1b12 100644 --- a/winpr/libwinpr/utils/collections/Queue.c +++ b/winpr/libwinpr/utils/collections/Queue.c @@ -164,9 +164,10 @@ BOOL Queue_Enqueue(wQueue* queue, void* obj) queue->capacity = new_capacity; queue->array = newArray; - ZeroMemory(&(queue->array[old_capacity]), old_capacity * sizeof(void*)); + ZeroMemory(&(queue->array[old_capacity]), (new_capacity - old_capacity) * sizeof(void*)); - if (queue->tail < old_capacity) + /* rearrange wrapped entries */ + if (queue->tail <= queue->head) { CopyMemory(&(queue->array[old_capacity]), queue->array, queue->tail * sizeof(void*)); queue->tail += old_capacity;