[Bf-blender-cvs] [3f1f4df3fd9] master: Fix unreported misuse of Win32 clipboard API

Jesse Yurkovich noreply at git.blender.org
Sat May 28 05:56:05 CEST 2022


Commit: 3f1f4df3fd9b37fb97fbf4632725032de87d0828
Author: Jesse Yurkovich
Date:   Fri May 27 20:52:52 2022 -0700
Branches: master
https://developer.blender.org/rB3f1f4df3fd9b37fb97fbf4632725032de87d0828

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

===================================================================

M	intern/ghost/intern/GHOST_SystemWin32.cpp

===================================================================

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;
-  }
 }
 
 /* -------------------------------------------------------------------- */



More information about the Bf-blender-cvs mailing list