scene: ensure node cannot be reparented below itself
@@ -138,6 +138,13 @@ void wlr_scene_node_reparent(struct wlr_scene_node *node,
if (node->parent == new_parent) {
return;
}
+ /* Ensure that a node cannot become its own ancestor */
+ for (struct wlr_scene_node *ancestor = new_parent; ancestor != NULL;
+ ancestor = ancestor->parent) {
+ if (ancestor == node) {
+ return;
+ }
+ }
wl_list_remove(&node->state.link);
