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
This commit is contained in:
parent
712b0496c1
commit
3f1f4df3fd
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
|
Loading…
Reference in New Issue