diff options
author | George Kiagiadakis <george.kiagiadakis@collabora.com> | 2014-06-13 18:10:26 +0200 |
---|---|---|
committer | Jason Ekstrand <jason.ekstrand@intel.com> | 2014-06-18 11:22:27 -0700 |
commit | ed04d38f6aa700a4634aa3f44b971e012600ebe4 (patch) | |
tree | 294d2837fce1eea3be4fa88c24fc3dcb260b4414 | |
parent | 549a53f18638438aba183dfdd1e0b6650985c3eb (diff) |
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
-rw-r--r-- | src/compositor.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/compositor.c b/src/compositor.c index 3c5c8e32..2fbfdbf8 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1662,8 +1662,10 @@ surface_free_unused_subsurface_views(struct weston_surface *surface) if (sub->surface == surface) 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); + } surface_free_unused_subsurface_views(sub->surface); } @@ -2764,8 +2766,10 @@ weston_subsurface_destroy(struct weston_subsurface *sub) assert(sub->parent_destroy_listener.notify == 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); + } if (sub->parent) weston_subsurface_unlink_parent(sub); |