Marcus Meissner : ole32: Clipboard format in the datacache is with trailing \0.
Alexandre Julliard
julliard at winehq.org
Mon Nov 6 14:37:36 CST 2017
Module: wine
Branch: master
Commit: d382b8e91a4516811b9c6b0d85b3d132bec6ea2f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d382b8e91a4516811b9c6b0d85b3d132bec6ea2f
Author: Marcus Meissner <marcus at jet.franken.de>
Date: Sun Nov 5 23:07:05 2017 +0100
ole32: Clipboard format in the datacache is with trailing \0.
GetClipboardFormatName returns length without terminating 0,
but we need to store it with \0.
Signed-off-by: Marcus Meissner <marcus at jet.franken.de>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ole32/datacache.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index 2907426..48453b4 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -470,6 +470,10 @@ static HRESULT read_clipformat(IStream *stream, CLIPFORMAT *clipformat)
hr = IStream_Read(stream, &length, sizeof(length), &read);
if (hr != S_OK || read != sizeof(length))
return DV_E_CLIPFORMAT;
+ if (!length) {
+ /* No clipboard format present */
+ return S_OK;
+ }
if (length == -1)
{
DWORD cf;
@@ -499,11 +503,16 @@ static HRESULT write_clipformat(IStream *stream, CLIPFORMAT clipformat)
{
DWORD length;
HRESULT hr;
+ char format_name[256];
if (clipformat < 0xc000)
length = -1;
else
- length = GetClipboardFormatNameA(clipformat, NULL, 0);
+ {
+ length = GetClipboardFormatNameA(clipformat, format_name, sizeof(format_name));
+ /* If there is a clipboard format name, we need to include its terminating \0 */
+ if (length) length++;
+ }
hr = IStream_Write(stream, &length, sizeof(length), NULL);
if (FAILED(hr))
return hr;
@@ -514,12 +523,7 @@ static HRESULT write_clipformat(IStream *stream, CLIPFORMAT clipformat)
}
else
{
- char *format_name = HeapAlloc(GetProcessHeap(), 0, length);
- if (!format_name)
- return E_OUTOFMEMORY;
- GetClipboardFormatNameA(clipformat, format_name, length);
hr = IStream_Write(stream, format_name, length, NULL);
- HeapFree(GetProcessHeap(), 0, format_name);
}
return hr;
}
More information about the wine-cvs
mailing list