[clients] fix wClipboard locking

This commit is contained in:
Armin Novak 2023-03-22 09:53:30 +01:00 committed by akallabeth
parent b7b46b8123
commit 3f5b44ba36
2 changed files with 10 additions and 4 deletions

View File

@ -273,6 +273,7 @@ static void wfl_cliprdr_add_client_format_id(wfClipboard* clipboard, UINT32 form
static BOOL wlf_cliprdr_add_client_format(wfClipboard* clipboard, const char* mime) static BOOL wlf_cliprdr_add_client_format(wfClipboard* clipboard, const char* mime)
{ {
WINPR_ASSERT(mime); WINPR_ASSERT(mime);
ClipboardLock(clipboard->system);
if (wlf_mime_is_html(mime)) if (wlf_mime_is_html(mime))
{ {
UINT32 formatId = ClipboardGetFormatId(clipboard->system, type_HtmlFormat); UINT32 formatId = ClipboardGetFormatId(clipboard->system, type_HtmlFormat);
@ -297,6 +298,7 @@ static BOOL wlf_cliprdr_add_client_format(wfClipboard* clipboard, const char* mi
wfl_cliprdr_add_client_format_id(clipboard, fileFormatId); wfl_cliprdr_add_client_format_id(clipboard, fileFormatId);
} }
ClipboardUnlock(clipboard->system);
if (wlf_cliprdr_send_client_format_list(clipboard) != CHANNEL_RC_OK) if (wlf_cliprdr_send_client_format_list(clipboard) != CHANNEL_RC_OK)
return FALSE; return FALSE;
return TRUE; return TRUE;
@ -732,6 +734,7 @@ wlf_cliprdr_server_format_data_request(CliprdrClientContext* context,
clipboard = cliprdr_file_context_get_context(context->custom); clipboard = cliprdr_file_context_get_context(context->custom);
WINPR_ASSERT(clipboard); WINPR_ASSERT(clipboard);
ClipboardLock(clipboard->system);
const UINT32 fileFormatId = ClipboardGetFormatId(clipboard->system, type_FileGroupDescriptorW); const UINT32 fileFormatId = ClipboardGetFormatId(clipboard->system, type_FileGroupDescriptorW);
const UINT32 htmlFormatId = ClipboardGetFormatId(clipboard->system, type_HtmlFormat); const UINT32 htmlFormatId = ClipboardGetFormatId(clipboard->system, type_HtmlFormat);
@ -776,7 +779,6 @@ wlf_cliprdr_server_format_data_request(CliprdrClientContext* context,
goto fail; goto fail;
} }
ClipboardLock(clipboard->system);
const BOOL res = ClipboardSetData(clipboard->system, localFormatId, data, size); const BOOL res = ClipboardSetData(clipboard->system, localFormatId, data, size);
free(data); free(data);
@ -785,7 +787,6 @@ wlf_cliprdr_server_format_data_request(CliprdrClientContext* context,
if (res) if (res)
data = ClipboardGetData(clipboard->system, formatId, &len); data = ClipboardGetData(clipboard->system, formatId, &len);
ClipboardUnlock(clipboard->system);
if (!res || !data) if (!res || !data)
goto fail; goto fail;
@ -798,6 +799,7 @@ wlf_cliprdr_server_format_data_request(CliprdrClientContext* context,
goto fail; goto fail;
} }
fail: fail:
ClipboardUnlock(clipboard->system);
rc = wlf_cliprdr_send_data_response(clipboard, ddata, dsize); rc = wlf_cliprdr_send_data_response(clipboard, ddata, dsize);
free(data); free(data);
return rc; return rc;
@ -837,6 +839,7 @@ wlf_cliprdr_server_format_data_response(CliprdrClientContext* context,
} }
rc = ERROR_INTERNAL_ERROR; rc = ERROR_INTERNAL_ERROR;
ClipboardLock(clipboard->system);
EnterCriticalSection(&clipboard->lock); EnterCriticalSection(&clipboard->lock);
UINT32 srcFormatId = 0; UINT32 srcFormatId = 0;
@ -881,13 +884,11 @@ wlf_cliprdr_server_format_data_response(CliprdrClientContext* context,
break; break;
} }
ClipboardLock(clipboard->system);
UINT32 len = 0; UINT32 len = 0;
const BOOL sres = ClipboardSetData(clipboard->system, srcFormatId, data, size); const BOOL sres = ClipboardSetData(clipboard->system, srcFormatId, data, size);
if (sres) if (sres)
data = ClipboardGetData(clipboard->system, dstFormatId, &len); data = ClipboardGetData(clipboard->system, dstFormatId, &len);
ClipboardUnlock(clipboard->system);
if (!sres || !data) if (!sres || !data)
goto unlock; goto unlock;
@ -902,6 +903,7 @@ wlf_cliprdr_server_format_data_response(CliprdrClientContext* context,
rc = CHANNEL_RC_OK; rc = CHANNEL_RC_OK;
unlock: unlock:
ClipboardUnlock(clipboard->system);
LeaveCriticalSection(&clipboard->lock); LeaveCriticalSection(&clipboard->lock);
fail: fail:
wlf_request_free(request); wlf_request_free(request);

View File

@ -862,6 +862,7 @@ static void xf_cliprdr_process_requested_data(xfClipboard* clipboard, BOOL hasDa
* We check for "FileGroupDescriptorW" format being registered (i.e., nonzero) in order * We check for "FileGroupDescriptorW" format being registered (i.e., nonzero) in order
* to not process CF_RAW as a file list in case WinPR does not support file transfers. * to not process CF_RAW as a file list in case WinPR does not support file transfers.
*/ */
ClipboardLock(clipboard->system);
if (format->formatToRequest && if (format->formatToRequest &&
(format->formatToRequest == (format->formatToRequest ==
ClipboardGetFormatId(clipboard->system, type_FileGroupDescriptorW))) ClipboardGetFormatId(clipboard->system, type_FileGroupDescriptorW)))
@ -888,6 +889,7 @@ static void xf_cliprdr_process_requested_data(xfClipboard* clipboard, BOOL hasDa
free(file_array); free(file_array);
} }
ClipboardUnlock(clipboard->system);
xf_cliprdr_send_data_response(clipboard, format, pDstData, DstSize); xf_cliprdr_send_data_response(clipboard, format, pDstData, DstSize);
free(pDstData); free(pDstData);
@ -1889,6 +1891,7 @@ xf_cliprdr_server_format_data_response(CliprdrClientContext* context,
return ERROR_INTERNAL_ERROR; return ERROR_INTERNAL_ERROR;
else if (format->formatName) else if (format->formatName)
{ {
ClipboardLock(clipboard->system);
if (strcmp(format->formatName, type_HtmlFormat) == 0) if (strcmp(format->formatName, type_HtmlFormat) == 0)
{ {
srcFormatId = ClipboardGetFormatId(clipboard->system, type_HtmlFormat); srcFormatId = ClipboardGetFormatId(clipboard->system, type_HtmlFormat);
@ -1916,6 +1919,7 @@ xf_cliprdr_server_format_data_response(CliprdrClientContext* context,
nullTerminated = TRUE; nullTerminated = TRUE;
} }
ClipboardUnlock(clipboard->system);
} }
else else
{ {