compositor: unmap subsurface views before destroying the subsurfaces
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>
Fri, 13 Jun 2014 16:10:26 +0000 (18:10 +0200)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 18 Jun 2014 18:22:27 +0000 (11:22 -0700)
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

src/compositor.c

index 3c5c8e3..2fbfdbf 100644 (file)
@@ -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);