Wayland: Fix handling of clipboard set to self

Passing any part of the result of glfwGetClipboardString to
glfwSetClipboardString would result in, at best, a use-after-free error.

(cherry picked from commit 9c95cfb9f1)
This commit is contained in:
Camilla Löwy 2022-03-22 18:46:57 +01:00
parent f93751ce68
commit 22f718dcf4
2 changed files with 11 additions and 11 deletions

View File

@ -129,6 +129,8 @@ information on what to include when reporting a bug.
match event scancode (#1993) match event scancode (#1993)
- [Win32] Bugfix: Instance-local operations used executable instance (#469,#1296,#1395) - [Win32] Bugfix: Instance-local operations used executable instance (#469,#1296,#1395)
- [Cocoa] Bugfix: A connected Apple AirPlay would emit a useless error (#1791) - [Cocoa] Bugfix: A connected Apple AirPlay would emit a useless error (#1791)
- [Wayland] Bugfix: `glfwSetClipboardString` would fail if set to result of
`glfwGetClipboardString`
## Contact ## Contact

View File

@ -1798,20 +1798,18 @@ void _glfwPlatformSetClipboardString(const char* string)
_glfw.wl.dataSource = NULL; _glfw.wl.dataSource = NULL;
} }
if (_glfw.wl.clipboardSendString) char* copy = _glfw_strdup(string);
if (!copy)
{ {
free(_glfw.wl.clipboardSendString); _glfwInputError(GLFW_OUT_OF_MEMORY,
_glfw.wl.clipboardSendString = NULL; "Wayland: Failed to allocate clipboard string");
}
_glfw.wl.clipboardSendString = strdup(string);
if (!_glfw.wl.clipboardSendString)
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"Wayland: Impossible to allocate clipboard string");
return; return;
} }
_glfw.wl.clipboardSendSize = strlen(string);
free(_glfw.wl.clipboardSendString);
_glfw.wl.clipboardSendString = copy;
_glfw.wl.clipboardSendSize = strlen(_glfw.wl.clipboardSendString);
_glfw.wl.dataSource = _glfw.wl.dataSource =
wl_data_device_manager_create_data_source(_glfw.wl.dataDeviceManager); wl_data_device_manager_create_data_source(_glfw.wl.dataDeviceManager);
if (!_glfw.wl.dataSource) if (!_glfw.wl.dataSource)