[PATCH] compositor: unmap subsurface views before destroying the subsurfaces
Pekka Paalanen
ppaalanen at gmail.com
Wed Jun 25 05:52:03 PDT 2014
On Fri, 13 Jun 2014 18:10:26 +0200
George Kiagiadakis <george.kiagiadakis at collabora.com> wrote:
> 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 | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/src/compositor.c b/src/compositor.c
> index 3c5c8e3..2fbfdbf 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);
Hi,
this patch was already merged and it fixes a real issue, but I am not
completely sure the latter hunk is totally correct alone.
weston_subsurface_destroy() is called when a sub-surface gets destroyed
for any reason. The above hunk prevents the compositor->view_list from
being updated, and this could be a theoretical problem, if the
destruction is caused directly by a client destroying a wl_sub_surface
or wl_surface, and that sub-surface has sub-surfaces of its own. These
nested sub-surfaces would need to be removed from the view_list too, as
they should become unmapped. Weston_compositor_pick_view() could
erroneusly target this supposedly unmapped-but-not-actually
sub-sub-surface.
In practise, I think hitting this problem will be very hard. It is
probably quite rare to use nested sub-surfaces, and the very next
compositor repaint will fix up the view_list, so we won't even get a
visual glitch. The only thing that could happen AFAIU is that some
input events targets a wl_surface they shouldn't, and that wl_surface
will disappear very soon anyway. Also, since destroying a surface so
that it unmaps causes a repaint, so the window for the fault is really
theoretical at best.
So, all is probably just fine. *shrug*
Thanks,
pq
More information about the wayland-devel
mailing list