From e129ab749bf2c6bf70c2d9ed958fd2f4726b7124 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 28 Feb 2023 21:22:49 +0100 Subject: [PATCH] fixed parsing of FILEDESCRIPTORW in WinPR --- winpr/libwinpr/clipboard/synthetic_file.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/winpr/libwinpr/clipboard/synthetic_file.c b/winpr/libwinpr/clipboard/synthetic_file.c index dd38cee31..5eba58fb0 100644 --- a/winpr/libwinpr/clipboard/synthetic_file.c +++ b/winpr/libwinpr/clipboard/synthetic_file.c @@ -791,7 +791,6 @@ static void* convert_filedescriptors_to_file_list(wClipboard* clipboard, UINT32 const FILEDESCRIPTORW* descriptors = NULL; UINT32 nrDescriptors = 0; size_t count, x, alloc, pos, baseLength = 0; - const char* src = (const char*)data; char* dst; size_t header_len = strlen(header); size_t lineprefix_len = strlen(lineprefix); @@ -810,16 +809,19 @@ static void* convert_filedescriptors_to_file_list(wClipboard* clipboard, UINT32 if (baseLength < 1) return NULL; - if (clipboard->delegate.ClientRequestFileSize) - nrDescriptors = (UINT32)(src[3] << 24) | (UINT32)(src[2] << 16) | (UINT32)(src[1] << 8) | - (src[0] & 0xFF); + wStream sbuffer = { 0 }; + wStream* s = Stream_StaticConstInit(&sbuffer, data, *pSize); + if (!Stream_CheckAndLogRequiredLength(TAG, s, 4)) + return NULL; + + Stream_Read_UINT32(s, nrDescriptors); count = (*pSize - 4) / sizeof(FILEDESCRIPTORW); if ((count < 1) || (count != nrDescriptors)) return NULL; - descriptors = (const FILEDESCRIPTORW*)&src[4]; + descriptors = (const FILEDESCRIPTORW*)Stream_Pointer(s); if (formatId != ClipboardGetFormatId(clipboard, mime_FileGroupDescriptorW)) return NULL;