compositor-wayland: actually free parent_output
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>
Thu, 19 Oct 2017 07:26:27 +0000 (10:26 +0300)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Tue, 24 Oct 2017 09:50:17 +0000 (12:50 +0300)
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 <pekka.paalanen@collabora.co.uk>
Reviewed-by: Quentin Glidic <sardemff7+git@sardemff7.net>
Acked-by: Daniel Stone <daniels@collabora.com>
libweston/compositor-wayland.c

index c0f67e9..9486dea 100644 (file)
@@ -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);
 }