From 7720ce7827e8bdaaf42f72fb29ecf91a2d3c2294 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sat, 2 May 2020 16:42:26 +0200 Subject: [PATCH] backend/multi: handle backends depending on each other properly wl_list_for_each_safe only allows the current list item to be removed. If a backend destroys itself when another backend is destroyed, this blows up. --- backend/multi/backend.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/multi/backend.c b/backend/multi/backend.c index 7ba25ca82..6289f1071 100644 --- a/backend/multi/backend.c +++ b/backend/multi/backend.c @@ -49,8 +49,11 @@ static void multi_backend_destroy(struct wlr_backend *wlr_backend) { wl_list_remove(&backend->display_destroy.link); - struct subbackend_state *sub, *next; - wl_list_for_each_safe(sub, next, &backend->backends, link) { + // Some backends may depend on other backends, ie. destroying a backend may + // also destroy other backends + while (!wl_list_empty(&backend->backends)) { + struct subbackend_state *sub = + wl_container_of(backend->backends.next, sub, link); wlr_backend_destroy(sub->backend); }