From 429b3538b2de5ad24e566c3ffeb82c899bece47b Mon Sep 17 00:00:00 2001 From: Kalev Lember Date: Thu, 25 Aug 2022 10:56:41 +0200 Subject: [PATCH] wayland: Ensure to unlink destroy listeners after destruction https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2592#note_1537242 --- 2588.patch | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++ mutter.spec | 9 +++- 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 2588.patch diff --git a/2588.patch b/2588.patch new file mode 100644 index 0000000..232e93c --- /dev/null +++ b/2588.patch @@ -0,0 +1,137 @@ +From 51064c1b4e46be180d4aa9b3fcfd57a6ea7ea615 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Fri, 19 Aug 2022 17:08:42 +0200 +Subject: [PATCH 1/3] wayland: Ensure to unlink destroy listeners after + destruction + +This is missed in some wl_listeners added +through wl_resource_add_destroy_listener(). Ensure this is done consistently +for all notify functions. + +Part-of: +--- + src/wayland/meta-wayland-data-device.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/src/wayland/meta-wayland-data-device.c b/src/wayland/meta-wayland-data-device.c +index c8cf8f5c4b..d6c28ff331 100644 +--- a/src/wayland/meta-wayland-data-device.c ++++ b/src/wayland/meta-wayland-data-device.c +@@ -173,11 +173,13 @@ unset_selection_source (MetaWaylandDataDevice *data_device, + } + + static void +-destroy_drag_focus (struct wl_listener *listener, void *data) ++destroy_drag_focus (struct wl_listener *listener, ++ void *data) + { + MetaWaylandDragGrab *grab = wl_container_of (listener, grab, drag_focus_listener); + + grab->drag_focus_data_device = NULL; ++ wl_list_remove (&grab->drag_focus_listener.link); + + g_clear_signal_handler (&grab->drag_focus_destroy_handler_id, + grab->drag_focus); +@@ -560,12 +562,14 @@ drag_grab_data_source_destroyed (gpointer data, GObject *where_the_object_was) + } + + static void +-destroy_data_device_icon (struct wl_listener *listener, void *data) ++destroy_data_device_icon (struct wl_listener *listener, ++ void *data) + { + MetaWaylandDragGrab *drag_grab = + wl_container_of (listener, drag_grab, drag_icon_listener); + + drag_grab->drag_surface = NULL; ++ wl_list_remove (&drag_grab->drag_icon_listener.link); + + if (drag_grab->feedback_actor) + clutter_actor_remove_all_children (drag_grab->feedback_actor); +-- +GitLab + + +From f4f39d3a2cd2de35e1f85e32182a34336d52ae3d Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Fri, 19 Aug 2022 17:10:15 +0200 +Subject: [PATCH 2/3] wayland: Ensure to unlink destroy listeners for + subsurfaces + +There is some surface tracking going on here, and all notify handlers +are possibly leaving the linked wl_listener behind. Ensure it is unlinked +in all destroy notification functions. + +Part-of: +--- + src/wayland/meta-wayland-subsurface.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/wayland/meta-wayland-subsurface.c b/src/wayland/meta-wayland-subsurface.c +index 3e088b04fb..6a23c86100 100644 +--- a/src/wayland/meta-wayland-subsurface.c ++++ b/src/wayland/meta-wayland-subsurface.c +@@ -342,6 +342,7 @@ subsurface_handle_pending_subsurface_destroyed (struct wl_listener *listener, + wl_container_of (listener, op, subsurface_destroy_listener); + + op->surface = NULL; ++ wl_list_remove (&op->subsurface_destroy_listener.link); + } + + static void +@@ -352,6 +353,7 @@ subsurface_handle_pending_sibling_destroyed (struct wl_listener *listener, + wl_container_of (listener, op, sibling_destroy_listener); + + op->sibling = NULL; ++ wl_list_remove (&op->sibling_destroy_listener.link); + } + + void +@@ -487,6 +489,7 @@ surface_handle_parent_surface_destroyed (struct wl_listener *listener, + + g_node_unlink (surface->subsurface_branch_node); + surface->sub.parent = NULL; ++ wl_list_remove (&surface->sub.parent_destroy_listener.link); + } + + static gboolean +-- +GitLab + + +From 9c402bd091255e8a21f7e3263559dbe63135dec7 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Fri, 19 Aug 2022 17:13:01 +0200 +Subject: [PATCH 3/3] wayland: Ensure to remove destroy listener for + MetaWaylandBuffer + +Avoid the chance of invalid memory access by leaving the wl_listener +behind when handling the destroy notification. + +Part-of: +--- + src/wayland/meta-wayland-buffer.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c +index 557952b6fe..7a22f824bc 100644 +--- a/src/wayland/meta-wayland-buffer.c ++++ b/src/wayland/meta-wayland-buffer.c +@@ -83,12 +83,13 @@ G_DEFINE_TYPE (MetaWaylandBuffer, meta_wayland_buffer, G_TYPE_OBJECT); + + static void + meta_wayland_buffer_destroy_handler (struct wl_listener *listener, +- void *data) ++ void *data) + { + MetaWaylandBuffer *buffer = + wl_container_of (listener, buffer, destroy_listener); + + buffer->resource = NULL; ++ wl_list_remove (&buffer->destroy_listener.link); + g_signal_emit (buffer, signals[RESOURCE_DESTROYED], 0); + g_object_unref (buffer); + } +-- +GitLab + diff --git a/mutter.spec b/mutter.spec index 70c1cd9..93e5618 100644 --- a/mutter.spec +++ b/mutter.spec @@ -10,7 +10,7 @@ Name: mutter Version: 43~beta -Release: 2%{?dist} +Release: 3%{?dist} Summary: Window and compositing manager based on Clutter License: GPLv2+ @@ -32,6 +32,10 @@ Patch3: 0001-build-Add-missing-include.patch # https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2592 Patch4: 2592.patch +# Backported from upstream +# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2588 +Patch5: 2588.patch + BuildRequires: pkgconfig(gobject-introspection-1.0) >= 1.41.0 BuildRequires: pkgconfig(sm) BuildRequires: pkgconfig(libwacom) @@ -175,6 +179,9 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop %{_datadir}/mutter-%{mutter_api_version}/tests %changelog +* Thu Aug 25 2022 Kalev Lember - 43~beta-3 +- wayland: Ensure to unlink destroy listeners after destruction + * Wed Aug 24 2022 Kalev Lember - 43~beta-2 - Backport upstream patch to fix a compositor crash (#2120470)