diff --git a/src/wayland/meta-wayland-subsurface.c b/src/wayland/meta-wayland-subsurface.c index b4c503d20..bc481db06 100644 --- a/src/wayland/meta-wayland-subsurface.c +++ b/src/wayland/meta-wayland-subsurface.c @@ -541,6 +541,17 @@ surface_handle_parent_surface_destroyed (struct wl_listener *listener, surface->sub.parent = NULL; } +static gboolean +is_same_or_ancestor (MetaWaylandSurface *surface, + MetaWaylandSurface *other_surface) +{ + if (surface == other_surface) + return TRUE; + if (other_surface->sub.parent) + return is_same_or_ancestor (surface, other_surface->sub.parent); + return FALSE; +} + static void wl_subcompositor_get_subsurface (struct wl_client *client, struct wl_resource *resource, @@ -560,6 +571,16 @@ wl_subcompositor_get_subsurface (struct wl_client *client, return; } + if (is_same_or_ancestor (surface, parent)) + { + wl_resource_post_error (resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE, + "Circular relationship between wl_surface@%d " + "and parent surface wl_surface@%d", + wl_resource_get_id (surface->resource), + wl_resource_get_id (parent->resource)); + return; + } + if (!meta_wayland_surface_assign_role (surface, META_TYPE_WAYLAND_SUBSURFACE, NULL))