From 2c33a1c2de1a675d84ede6b0d751cb28abeb7e44 Mon Sep 17 00:00:00 2001 From: Kirill Primak Date: Sun, 8 Oct 2023 13:21:00 +0300 Subject: [PATCH] util/addon: make wlr_addon_set_finish() safer wl_list_for_each_safe() breaks if an item immediately after the current one is removed, see https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4358#note_2106260. --- util/addon.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/util/addon.c b/util/addon.c index 0f9037a2..63bcb5b6 100644 --- a/util/addon.c +++ b/util/addon.c @@ -11,16 +11,16 @@ void wlr_addon_set_init(struct wlr_addon_set *set) { } void wlr_addon_set_finish(struct wlr_addon_set *set) { - struct wlr_addon *addon, *tmp; - wl_list_for_each_safe(addon, tmp, &set->addons, link) { + while (!wl_list_empty(&set->addons)) { + struct wl_list *link = set->addons.next; + struct wlr_addon *addon = wl_container_of(link, addon, link); + const struct wlr_addon_interface *impl = addon->impl; addon->impl->destroy(addon); + if (set->addons.next == link) { + wlr_log(WLR_ERROR, "Dangling addon: %s", impl->name); + abort(); + } } - - wl_list_for_each(addon, &set->addons, link) { - wlr_log(WLR_ERROR, "Dangling addon: %s", addon->impl->name); - } - - assert(wl_list_empty(&set->addons)); } void wlr_addon_init(struct wlr_addon *addon, struct wlr_addon_set *set,