From 7720ce7827e8bdaaf42f72fb29ecf91a2d3c2294 Mon Sep 17 00:00:00 2001
From: Simon Ser <contact@emersion.fr>
Date: Sat, 2 May 2020 16:42:26 +0200
Subject: 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(-)

(limited to 'backend')

diff --git a/backend/multi/backend.c b/backend/multi/backend.c
index 7ba25ca8..6289f107 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);
 	}
 
-- 
cgit v1.2.3