From cfde02d47a503cbfd0629bbfe0cb776686af8a91 Mon Sep 17 00:00:00 2001 From: Marius Vlad Date: Tue, 9 Apr 2024 18:34:22 +0300 Subject: [PATCH] libweston: Add paint node destruction into weston_layer_entry_remove() This prevents a potential crash where users of weston_layer_entry_insert/layer_entry_remove() would see when moving views into a NULL layer (effectively unmapping the surface/view). Users that have migrated to the weston_view_move_to_layer() are immune to this issue because that takes care paint node destruction. Signed-off-by: Marius Vlad --- libweston/compositor.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/libweston/compositor.c b/libweston/compositor.c index bb29b83b5..ea257bb90 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -3980,17 +3980,10 @@ weston_view_move_to_layer(struct weston_view *view, struct weston_layer_entry *layer) { bool was_mapped = view->is_mapped; - struct weston_paint_node *pnode, *pntmp; if (layer == &view->layer_link) return; - /* Remove all paint nodes because we have no idea what a layer change - * does to view visibility on any output. - */ - wl_list_for_each_safe(pnode, pntmp, &view->paint_node_list, view_link) - weston_paint_node_destroy(pnode); - view->surface->compositor->view_list_needs_rebuild = true; /* Damage the view's old region, and remove it from the layer. */ @@ -4020,6 +4013,16 @@ weston_view_move_to_layer(struct weston_view *view, WL_EXPORT void weston_layer_entry_remove(struct weston_layer_entry *entry) { + struct weston_paint_node *pnode, *pntmp; + struct weston_view *view; + + /* Remove all paint nodes because we have no idea what a layer change + * does to view visibility on any output. + */ + view = container_of(entry, struct weston_view, layer_link); + wl_list_for_each_safe(pnode, pntmp, &view->paint_node_list, view_link) + weston_paint_node_destroy(pnode); + wl_list_remove(&entry->link); wl_list_init(&entry->link); entry->layer = NULL; -- 2.43.0