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
dev
George Kiagiadakis 11 years ago committed by Jason Ekstrand
parent 549a53f186
commit ed04d38f6a
  1. 8
      src/compositor.c

@ -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);

Loading…
Cancel
Save