compositor: unmap subsurface views before destroying the subsurfaces
This is to avoid recursing into weston_compositor_build_view_list() and therefore fix crashing when destroying a stack of visible subsurfaces due to weston_compositor_build_view_list() being called recursively and corrupting the lists it works on. https://bugs.freedesktop.org/show_bug.cgi?id=79684
This commit is contained in:
committed by
Jason Ekstrand
parent
549a53f186
commit
ed04d38f6a
+6
-2
@@ -1662,8 +1662,10 @@ surface_free_unused_subsurface_views(struct weston_surface *surface)
|
|||||||
if (sub->surface == surface)
|
if (sub->surface == surface)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
wl_list_for_each_safe(view, nv, &sub->unused_views, surface_link)
|
wl_list_for_each_safe(view, nv, &sub->unused_views, surface_link) {
|
||||||
|
weston_view_unmap (view);
|
||||||
weston_view_destroy(view);
|
weston_view_destroy(view);
|
||||||
|
}
|
||||||
|
|
||||||
surface_free_unused_subsurface_views(sub->surface);
|
surface_free_unused_subsurface_views(sub->surface);
|
||||||
}
|
}
|
||||||
@@ -2764,8 +2766,10 @@ weston_subsurface_destroy(struct weston_subsurface *sub)
|
|||||||
assert(sub->parent_destroy_listener.notify ==
|
assert(sub->parent_destroy_listener.notify ==
|
||||||
subsurface_handle_parent_destroy);
|
subsurface_handle_parent_destroy);
|
||||||
|
|
||||||
wl_list_for_each_safe(view, next, &sub->surface->views, surface_link)
|
wl_list_for_each_safe(view, next, &sub->surface->views, surface_link) {
|
||||||
|
weston_view_unmap(view);
|
||||||
weston_view_destroy(view);
|
weston_view_destroy(view);
|
||||||
|
}
|
||||||
|
|
||||||
if (sub->parent)
|
if (sub->parent)
|
||||||
weston_subsurface_unlink_parent(sub);
|
weston_subsurface_unlink_parent(sub);
|
||||||
|
|||||||
Reference in New Issue
Block a user