summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarnabás Pőcze <pobrn@protonmail.com>2023-05-09 17:15:52 +0200
committerMarge Bot <marge-bot@gnome.org>2023-05-14 23:15:55 +0000
commitf01428bd96724e440748be11ff325cbc1c7c4c3e (patch)
treeefce91358e6c310e536d3f60caa99dae2d9e2f84
parent10d370eb033852edb6fb8aaa039420dd13ca77cb (diff)
downloadmutter-f01428bd96724e440748be11ff325cbc1c7c4c3e.tar.gz
backends/x11: Fix type confusion about object data
Since c390f70edca40d ("backend: Set up and use ownership chains") the type of the ClutterInputDevice object's "meta-input-settings-xdevice" data is `DeviceHandle`, but that commit failed to change the one place where the object data is queried. As a consequence, that part still considers it to be an `XDevice`, so everything that uses the return value of `device_ensure_xdevice()` works with invalid data. Furthermore, `device_handle_free()` incorrectly uses the `user_data` as the argument for `XCloseDevice()` leading to a double free. Fixes: c390f70edca40d ("backend: Set up and use ownership chains") Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2995>
-rw-r--r--src/backends/x11/meta-input-settings-x11.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
index 9a0b37e29..459636d23 100644
--- a/src/backends/x11/meta-input-settings-x11.c
+++ b/src/backends/x11/meta-input-settings-x11.c
@@ -75,10 +75,9 @@ device_handle_free (gpointer user_data)
MetaDisplay *display = get_display (settings);
MetaBackend *backend = get_backend (settings);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
- XDevice *xdev = user_data;
meta_x11_error_trap_push (display->x11_display);
- XCloseDevice (xdisplay, xdev);
+ XCloseDevice (xdisplay, handle->xdev);
meta_x11_error_trap_pop (display->x11_display);
g_free (handle);
@@ -92,11 +91,12 @@ device_ensure_xdevice (MetaInputSettings *settings,
MetaBackend *backend = get_backend (settings);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
int device_id = meta_input_device_x11_get_device_id (device);
- XDevice *xdev = NULL;
+ DeviceHandle *handle;
+ XDevice *xdev;
- xdev = g_object_get_data (G_OBJECT (device), "meta-input-settings-xdevice");
- if (xdev)
- return xdev;
+ handle = g_object_get_data (G_OBJECT (device), "meta-input-settings-xdevice");
+ if (handle)
+ return handle->xdev;
meta_x11_error_trap_push (display->x11_display);
xdev = XOpenDevice (xdisplay, device_id);
@@ -104,8 +104,6 @@ device_ensure_xdevice (MetaInputSettings *settings,
if (xdev)
{
- DeviceHandle *handle;
-
handle = g_new0 (DeviceHandle, 1);
handle->settings = settings;
handle->xdev = xdev;