compositor: fix endless recursion in scene-graph printing
authorMichael Olbrich <m.olbrich@pengutronix.de>
Wed, 29 Apr 2020 07:03:15 +0000 (09:03 +0200)
committerMichael Olbrich <m.olbrich@pengutronix.de>
Wed, 29 Apr 2020 07:17:19 +0000 (09:17 +0200)
If a surface has subsurfaces then the surface itself is in the subsurface
list. To avoid printing it again there is a check to skip the child view,
if it is the same as the current view.

However, this fails when a surface with subsurfaces has two (or more) views:
The check to skip the parent fails for the other view and the two views are
printed again and again until a stack overflow occurs.

So instead check if the parent view of the subsurface view is the current
view. This way, any view that does not belong to a real subsurface is
skipped.

As a side effect, this ensures that each view of the subsurfaces is only
printed once at the correct place in the hierarchy.

Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
libweston/compositor.c

index 35da1e658a02bd7340badd4338948c78a7c3963c..5fda94328c086674780a0436b1aa26bf31a8c3ba 100644 (file)
@@ -7162,8 +7162,8 @@ debug_scene_view_print_tree(struct weston_view *view,
 
        wl_list_for_each(sub, &view->surface->subsurface_list, parent_link) {
                wl_list_for_each(ev, &sub->surface->views, surface_link) {
-                       /* do not print again the parent view */
-                       if (view == ev)
+                       /* only print the child views of the current view */
+                       if (ev->parent_view != view)
                                continue;
 
                        (*view_idx)++;