From 4d6a800850049f91a4b2a87667aef0b6cb79e3de Mon Sep 17 00:00:00 2001 From: akallabeth Date: Thu, 18 Jun 2020 08:42:24 +0200 Subject: [PATCH] Fixed missing lock during buffer submit. (cherry picked from commit c902f583d0911c1e8938c5f14f3f257eb9737745) --- client/Wayland/wlfreerdp.c | 7 +++++-- uwac/libuwac/uwac-window.c | 18 ++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/client/Wayland/wlfreerdp.c b/client/Wayland/wlfreerdp.c index 872f200..11b747e 100644 --- a/client/Wayland/wlfreerdp.c +++ b/client/Wayland/wlfreerdp.c @@ -304,6 +304,7 @@ static void wl_post_disconnect(freerdp* instance) static BOOL handle_uwac_events(freerdp* instance, UwacDisplay* display) { + BOOL rc; UwacEvent event; wlfContext* context; @@ -329,9 +330,11 @@ static BOOL handle_uwac_events(freerdp* instance, UwacDisplay* display) break; case UWAC_EVENT_FRAME_DONE: - if (UwacWindowSubmitBuffer(context->window, false) != UWAC_SUCCESS) + EnterCriticalSection(&context->critical); + rc = UwacWindowSubmitBuffer(context->window, false); + LeaveCriticalSection(&context->critical); + if (rc != UWAC_SUCCESS) return FALSE; - break; case UWAC_EVENT_POINTER_ENTER: diff --git a/uwac/libuwac/uwac-window.c b/uwac/libuwac/uwac-window.c index 2f424e8..1dc5574 100644 --- a/uwac/libuwac/uwac-window.c +++ b/uwac/libuwac/uwac-window.c @@ -737,27 +737,29 @@ UwacReturnCode UwacWindowGetDrawingBufferGeometry(UwacWindow* window, UwacSize* UwacReturnCode UwacWindowSubmitBuffer(UwacWindow* window, bool copyContentForNextFrame) { - UwacBuffer* drawingBuffer; - UwacBuffer* nextBuffer; + UwacBuffer* currentDrawingBuffer; + UwacBuffer* nextDrawingBuffer; + UwacBuffer* pendingBuffer; if (window->drawingBufferIdx < 0) return UWAC_ERROR_INTERNAL; - drawingBuffer = &window->buffers[window->drawingBufferIdx]; + currentDrawingBuffer = &window->buffers[window->drawingBufferIdx]; - if ((window->pendingBufferIdx >= 0) || !drawingBuffer->dirty) + if ((window->pendingBufferIdx >= 0) || !currentDrawingBuffer->dirty) return UWAC_SUCCESS; window->pendingBufferIdx = window->drawingBufferIdx; - nextBuffer = UwacWindowFindFreeBuffer(window, &window->drawingBufferIdx); + nextDrawingBuffer = UwacWindowFindFreeBuffer(window, &window->drawingBufferIdx); + pendingBuffer = &window->buffers[window->pendingBufferIdx]; - if ((!nextBuffer) || (window->drawingBufferIdx < 0)) + if ((!nextDrawingBuffer) || (window->drawingBufferIdx < 0)) return UWAC_ERROR_NOMEMORY; if (copyContentForNextFrame) - memcpy(nextBuffer->data, drawingBuffer->data, window->stride * window->height); + memcpy(nextDrawingBuffer->data, pendingBuffer->data, window->stride * window->height); - UwacSubmitBufferPtr(window, drawingBuffer); + UwacSubmitBufferPtr(window, pendingBuffer); return UWAC_SUCCESS; } -- 2.7.4