From: Pekka Paalanen <[email protected]>

I could not find anywhere where struct parent_output was freed, so
apparently we were leaking it.

Check against wayland_backend_register_output() and add the missing
clean-up: removal from the parent output list, and free().

registry_handle_global_remove() also needs fixing to use a safer loop,
because now we are actually removing the list item.

Signed-off-by: Pekka Paalanen <[email protected]>
---
 libweston/compositor-wayland.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/libweston/compositor-wayland.c b/libweston/compositor-wayland.c
index c0f67e9a..9486deae 100644
--- a/libweston/compositor-wayland.c
+++ b/libweston/compositor-wayland.c
@@ -2333,6 +2333,9 @@ wayland_parent_output_destroy(struct 
wayland_parent_output *output)
                wl_list_remove(&mode->link);
                free(mode);
        }
+
+       wl_list_remove(&output->link);
+       free(output);
 }
 
 static void
@@ -2385,9 +2388,9 @@ registry_handle_global_remove(void *data, struct 
wl_registry *registry,
                              uint32_t name)
 {
        struct wayland_backend *b = data;
-       struct wayland_parent_output *output;
+       struct wayland_parent_output *output, *next;
 
-       wl_list_for_each(output, &b->parent.output_list, link)
+       wl_list_for_each_safe(output, next, &b->parent.output_list, link)
                if (output->id == name)
                        wayland_parent_output_destroy(output);
 }
-- 
2.13.6

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to