[PATCH] ole32: clipboard format in the datacache is with leading \0
Marcus Meissner <[email protected]> Sun, 5 Nov 2017 23:07:05 +0100
| Newsgroups | gmane.comp.emulators.wine.patches |
|---|---|
| Message-ID | <[email protected]> |
GetClipboardFormatName returns length without terminating 0, but we need to store it with \0. Signed-off-by: Marcus Meissner <[email protected]> --- 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 2907426f62..48453b4d52 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; } -- 2.14.3