From 426e41f500f7e8f73141723345828ea1f6da4748 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Wed, 4 Nov 2020 23:34:10 +0200 Subject: [PATCH] Check for subsurface loops If subsurfaces form a loop, kwin will get stuck in an infinite recursion while it constructs a window pixmap tree. --- src/wayland/subcompositor_interface.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/wayland/subcompositor_interface.cpp b/src/wayland/subcompositor_interface.cpp index 8fa05ad8fb..0f6c9dec89 100644 --- a/src/wayland/subcompositor_interface.cpp +++ b/src/wayland/subcompositor_interface.cpp @@ -50,6 +50,19 @@ void SubCompositorInterfacePrivate::subcompositor_get_subsurface(Resource *resou return; } + if (surface == parent) { + wl_resource_post_error(resource->handle, error_bad_surface, + "wl_surface@%d cannot be its own parent", + wl_resource_get_id(surface_resource)); + return; + } + if (parent->subSurface() && parent->subSurface()->mainSurface() == surface) { + wl_resource_post_error(resource->handle, error_bad_surface, + "wl_surface@%d is an ancestor of parent", + wl_resource_get_id(surface_resource)); + return; + } + wl_resource *subsurfaceResource = wl_resource_create(resource->client(), &wl_subsurface_interface, resource->version(), id); if (!subsurfaceResource) {