wayland/subsurface: Check for circular relationships
If a subsurface is equal to or an ancestor of the parent surface we currently crash. Check for that case and terminate the client. Closes https://gitlab.gnome.org/GNOME/mutter/-/issues/1521
This commit is contained in:
parent
4ecc80fd80
commit
4e9a67acc6
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user