Merge branch 'safer-addons' into 'master'

util/addon: make wlr_addon_set_finish() safer

See merge request wlroots/wlroots!4379
This commit is contained in:
Kirill Primak 2023-10-08 11:06:14 +00:00
commit b9535c7239

View file

@ -11,16 +11,16 @@ void wlr_addon_set_init(struct wlr_addon_set *set) {
} }
void wlr_addon_set_finish(struct wlr_addon_set *set) { void wlr_addon_set_finish(struct wlr_addon_set *set) {
struct wlr_addon *addon, *tmp; while (!wl_list_empty(&set->addons)) {
wl_list_for_each_safe(addon, tmp, &set->addons, link) { 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); 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, void wlr_addon_init(struct wlr_addon *addon, struct wlr_addon_set *set,