1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
From cfde02d47a503cbfd0629bbfe0cb776686af8a91 Mon Sep 17 00:00:00 2001
From: Marius Vlad <marius.vlad@collabora.com>
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 <marius.vlad@collabora.com>
---
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
|