From 3f1f4df3fd9b37fb97fbf4632725032de87d0828 Mon Sep 17 00:00:00 2001 From: Jesse Yurkovich Date: Fri, 27 May 2022 20:52:52 -0700 Subject: Fix unreported misuse of Win32 clipboard API An ASAN build highlighted a longstanding bug during ctrl+c operations inside various text widgets. The existing code had mismatched memory lock/unlock calls and was using the wrong allocator. Fix the code surrounding `SetClipboardData` to be correct per MSDN: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setclipboarddata Differential Revision: https://developer.blender.org/D15039 --- intern/ghost/intern/GHOST_SystemWin32.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'intern') diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 8e07bf4ea3d..28c86db53e2 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -2211,31 +2211,28 @@ char *GHOST_SystemWin32::getClipboard(bool selection) const void GHOST_SystemWin32::putClipboard(const char *buffer, bool selection) const { - if (selection) { + if (selection || !buffer) { return; } // for copying the selection, used on X11 if (OpenClipboard(NULL)) { - HLOCAL clipbuffer; - wchar_t *data; + EmptyClipboard(); - if (buffer) { - size_t len = count_utf_16_from_8(buffer); - EmptyClipboard(); + // Get length of buffer including the terminating null + size_t len = count_utf_16_from_8(buffer); - clipbuffer = LocalAlloc(LMEM_FIXED, sizeof(wchar_t) * len); - data = (wchar_t *)GlobalLock(clipbuffer); + HGLOBAL clipbuffer = GlobalAlloc(GMEM_MOVEABLE, sizeof(wchar_t) * len); + if (clipbuffer) { + wchar_t *data = (wchar_t *)GlobalLock(clipbuffer); conv_utf_8_to_16(buffer, data, len); - LocalUnlock(clipbuffer); + GlobalUnlock(clipbuffer); SetClipboardData(CF_UNICODETEXT, clipbuffer); } + CloseClipboard(); } - else { - return; - } } /* -------------------------------------------------------------------- */ -- cgit v1.2.3