Fix potential memory leak of two pointers (xwayland and client) 57/27257/6
authorduerpei <duep.fnst@fujitsu.com>
Mon, 14 Mar 2022 05:27:43 +0000 (13:27 +0800)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Fri, 18 Mar 2022 10:17:05 +0000 (10:17 +0000)
This backports four patches from weston to solve a memory leak problem
These four patches are:
https://gitlab.freedesktop.org/wayland/weston/-/commit/5a6604a7a2e52e5cd84c1f53724b3f7c325b5dff.patch
https://gitlab.freedesktop.org/wayland/weston/-/commit/f53c05d3c2c19c139c52e9bd621c2654dd3dac69.patch
https://gitlab.freedesktop.org/wayland/weston/-/commit/e2583ca0844bd7a8ce4fc94da9ad67edf49ffd45.patch
https://gitlab.freedesktop.org/wayland/weston/-/commit/8740037a93c7c4400cc381ecf3009d1e4014be07.patch

The following is the valgrind log:
 160  bytes in 1 blocks are definitely lost in loss record 39 of 66
     at 0x484B64C: calloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
     by 0x4A73C87: ??? (in /usr/lib/libweston-desktop-8.so.0.0.0)
     by 0x4A7184F: weston_desktop_create (in /usr/lib/libweston-desktop-8.so.0.0.0)
     by 0x487096B: ivi_desktop_init (in /usr/lib/agl-compositor/libexec_compositor.so.0.0.0)
     by 0x486F5E7: wet_main (in /usr/lib/agl-compositor/libexec_compositor.so.0.0.0)
     by 0x48B010F: (below main) (in /lib/libc-2.31.so)

In agl-compositor/src/composiotr.c
"ivi->desktop->compositor->xwayland" is zalloced by
wet_main()->ivi_desktop_init()->weston_desktop_create()->weston_desktop_xwayland_init()
"ivi->desktop->compositor->xwayland->client" is zalloced by
wet_main()->ivi_desktop_init()->weston_desktop_create()->weston_desktop_xwayland_init()->weston_desktop_client_create()

"ivi->desktop->compositor->xwayland" and
"ivi->desktop->compositor->xwayland->client"
The memory pointed to has not been released
Now, I want to free the memory pointed by the two pointers.
What can do this is the function of weston_desktop_xwayland_fini() in
0003-libweston-desktop-add-weston_desktop_xwayland_fini.patch
And the submission of this patch depends on the first three patches,
so I submitted these four patches.

Bug-AGL: SPEC-4291

Signed-off-by: duerpei <duep.fnst@fujitsu.com>
Change-Id: I3b1140e88eadad9e378c2bb43221026e280ecd90
Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/meta-agl/+/27257
Reviewed-by: Marius Vlad <marius.vlad@collabora.com>
Reviewed-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
Tested-by: Jenkins Job builder account
meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-add-weston_layer_fini.patch [new file with mode: 0644]
meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-desktop-rename-weston_desktop_client_destr.patch [new file with mode: 0644]
meta-agl-core/recipes-graphics/wayland/weston/0002-libweston-desktop-introduce-weston_desktop_client_de.patch [new file with mode: 0644]
meta-agl-core/recipes-graphics/wayland/weston/0003-libweston-desktop-add-weston_desktop_xwayland_fini.patch [new file with mode: 0644]
meta-agl-core/recipes-graphics/wayland/weston_8.0_aglcore.inc

diff --git a/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-add-weston_layer_fini.patch b/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-add-weston_layer_fini.patch
new file mode 100644 (file)
index 0000000..5b4fd04
--- /dev/null
@@ -0,0 +1,82 @@
+From 8740037a93c7c4400cc381ecf3009d1e4014be07 Mon Sep 17 00:00:00 2001
+From: Pekka Paalanen <pekka.paalanen@collabora.com>
+Upstream-Status: Backport
+Date: Fri, 14 May 2021 14:29:40 +0300
+Subject: [PATCH] libweston: add weston_layer_fini()
+
+Layers did not have a fini sequence before, which means the compositor
+layer list might have stale pointers temporarily when shutting down. A
+bigger problem might be having views linger after the destruction of the
+layer.
+
+These problems were not observed yet, but if they exist, this patch
+should help to find them and then fix them.
+
+The check in weston_compositor_shutdown() is not an assert yet, because
+it will trigger until all components call weston_layer_fini() correctly.
+Some components do not even have a tear-down function to call it from at
+all, like fullscreen-shell.
+
+The same with the check in weston_layer_fini().
+
+Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
+---
+ include/libweston/libweston.h |  2 ++
+ libweston/compositor.c        | 21 +++++++++++++++++++++
+ 2 files changed, 23 insertions(+)
+
+diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h
+index 7e8e7a625..d9907de0d 100644
+--- a/include/libweston/libweston.h
++++ b/include/libweston/libweston.h
+@@ -1637,6 +1637,8 @@ void
+ weston_layer_init(struct weston_layer *layer,
+                 struct weston_compositor *compositor);
+ void
++weston_layer_fini(struct weston_layer *layer);
++void
+ weston_layer_set_position(struct weston_layer *layer,
+                         enum weston_layer_position position);
+ void
+diff --git a/libweston/compositor.c b/libweston/compositor.c
+index dc6ecb2ce..c2da3a48c 100644
+--- a/libweston/compositor.c
++++ b/libweston/compositor.c
+@@ -3243,6 +3243,21 @@ weston_layer_init(struct weston_layer *layer,
+       weston_layer_set_mask_infinite(layer);
+ }
++/** Finalize the weston_layer struct.
++ *
++ * \param layer The layer to finalize.
++ */
++WL_EXPORT void
++weston_layer_fini(struct weston_layer *layer)
++{
++      wl_list_remove(&layer->link);
++
++      if (!wl_list_empty(&layer->view_list.link))
++              weston_log("BUG: finalizing a layer with views still on it.\n");
++
++      wl_list_remove(&layer->view_list.link);
++}
++
+ /** Sets the position of the layer in the layer list. The layer will be placed
+  * below any layer with the same position value, if any.
+  * This function is safe to call if the layer is already on the list, but the
+@@ -7738,6 +7753,12 @@ weston_compositor_shutdown(struct weston_compositor *ec)
+       weston_binding_list_destroy_all(&ec->debug_binding_list);
+       weston_plane_release(&ec->primary_plane);
++
++      weston_layer_fini(&ec->fade_layer);
++      weston_layer_fini(&ec->cursor_layer);
++
++      if (!wl_list_empty(&ec->layer_list))
++              weston_log("BUG: layer_list is not empty after shutdown. Calls to weston_layer_fini() are missing somwhere.\n");
+ }
+ /** weston_compositor_exit_with_code
+-- 
+GitLab
+
diff --git a/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-desktop-rename-weston_desktop_client_destr.patch b/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-desktop-rename-weston_desktop_client_destr.patch
new file mode 100644 (file)
index 0000000..5332a89
--- /dev/null
@@ -0,0 +1,51 @@
+From 5a6604a7a2e52e5cd84c1f53724b3f7c325b5dff Mon Sep 17 00:00:00 2001
+From: Pekka Paalanen <pekka.paalanen@collabora.com>
+Upstream-Status: Backport
+Date: Fri, 14 May 2021 15:54:56 +0300
+Subject: [PATCH] libweston-desktop: rename weston_desktop_client_destroy()
+
+This function here is a wl_resource destructor, but we will need another
+function for externally triggered destroy when wl_resource does not
+exist.
+
+Rename the existing function, because the old name fits better the new
+function to be written.
+
+Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
+---
+ libweston-desktop/client.c | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+diff --git a/libweston-desktop/client.c b/libweston-desktop/client.c
+index 56413f713..ba7bfbc46 100644
+--- a/libweston-desktop/client.c
++++ b/libweston-desktop/client.c
+@@ -49,7 +49,7 @@ weston_desktop_client_add_destroy_listener(struct weston_desktop_client *client,
+ }
+ static void
+-weston_desktop_client_destroy(struct wl_resource *resource)
++weston_desktop_client_handle_destroy(struct wl_resource *resource)
+ {
+       struct weston_desktop_client *client =
+               wl_resource_get_user_data(resource);
+@@ -117,13 +117,12 @@ weston_desktop_client_create(struct weston_desktop *desktop,
+       if (dispatcher != NULL)
+               wl_resource_set_dispatcher(client->resource, dispatcher,
+-                                         weston_desktop_client_destroy, client,
+-                                         weston_desktop_client_destroy);
++                                         weston_desktop_client_handle_destroy, client,
++                                         weston_desktop_client_handle_destroy);
+       else
+               wl_resource_set_implementation(client->resource, implementation,
+                                              client,
+-                                             weston_desktop_client_destroy);
+-
++                                             weston_desktop_client_handle_destroy);
+       display = wl_client_get_display(client->client);
+       loop = wl_display_get_event_loop(display);
+-- 
+GitLab
+
diff --git a/meta-agl-core/recipes-graphics/wayland/weston/0002-libweston-desktop-introduce-weston_desktop_client_de.patch b/meta-agl-core/recipes-graphics/wayland/weston/0002-libweston-desktop-introduce-weston_desktop_client_de.patch
new file mode 100644 (file)
index 0000000..229c850
--- /dev/null
@@ -0,0 +1,88 @@
+From f53c05d3c2c19c139c52e9bd621c2654dd3dac69 Mon Sep 17 00:00:00 2001
+From: Pekka Paalanen <pekka.paalanen@collabora.com>
+Upstream-Status: Backport
+Date: Fri, 14 May 2021 16:04:45 +0300
+Subject: [PATCH] libweston-desktop: introduce weston_desktop_client_destroy()
+
+This new function is callable explicitly, unlike the old function that
+used to have the same name.
+
+This will be needed when tearing down what
+weston_desktop_xwayland_init() puts up.
+
+Since calling weston_desktop_client_destroy() for an external client
+(one that has a wl_resource for this) is a bug, add asserts to prevent
+it. This will only be needed for the internal client: XWM.
+
+Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
+---
+ libweston-desktop/client.c   | 21 +++++++++++++++++----
+ libweston-desktop/internal.h |  2 ++
+ 2 files changed, 19 insertions(+), 4 deletions(-)
+
+diff --git a/libweston-desktop/client.c b/libweston-desktop/client.c
+index ba7bfbc46..44718e2db 100644
+--- a/libweston-desktop/client.c
++++ b/libweston-desktop/client.c
+@@ -24,6 +24,7 @@
+ #include "config.h"
+ #include <wayland-server.h>
++#include <assert.h>
+ #include <libweston/libweston.h>
+ #include <libweston/zalloc.h>
+@@ -48,14 +49,14 @@ weston_desktop_client_add_destroy_listener(struct weston_desktop_client *client,
+       wl_signal_add(&client->destroy_signal, listener);
+ }
+-static void
+-weston_desktop_client_handle_destroy(struct wl_resource *resource)
++void
++weston_desktop_client_destroy(struct weston_desktop_client *client)
+ {
+-      struct weston_desktop_client *client =
+-              wl_resource_get_user_data(resource);
+       struct wl_list *list = &client->surface_list;
+       struct wl_list *link, *tmp;
++      assert(client->resource == NULL);
++
+       wl_signal_emit(&client->destroy_signal, client);
+       for (link = list->next, tmp = link->next;
+@@ -71,6 +72,18 @@ weston_desktop_client_handle_destroy(struct wl_resource *resource)
+       free(client);
+ }
++static void
++weston_desktop_client_handle_destroy(struct wl_resource *resource)
++{
++      struct weston_desktop_client *client =
++              wl_resource_get_user_data(resource);
++
++      assert(client->resource == resource);
++      client->resource = NULL;
++
++      weston_desktop_client_destroy(client);
++}
++
+ static int
+ weston_desktop_client_ping_timeout(void *user_data)
+ {
+diff --git a/libweston-desktop/internal.h b/libweston-desktop/internal.h
+index e4ab2701b..7a815bd87 100644
+--- a/libweston-desktop/internal.h
++++ b/libweston-desktop/internal.h
+@@ -134,6 +134,8 @@ weston_desktop_client_create(struct weston_desktop *desktop,
+                            const struct wl_interface *interface,
+                            const void *implementation, uint32_t version,
+                            uint32_t id);
++void
++weston_desktop_client_destroy(struct weston_desktop_client *client);
+ void
+ weston_desktop_client_add_destroy_listener(struct weston_desktop_client *client,
+-- 
+GitLab
+
diff --git a/meta-agl-core/recipes-graphics/wayland/weston/0003-libweston-desktop-add-weston_desktop_xwayland_fini.patch b/meta-agl-core/recipes-graphics/wayland/weston/0003-libweston-desktop-add-weston_desktop_xwayland_fini.patch
new file mode 100644 (file)
index 0000000..1bcf5c7
--- /dev/null
@@ -0,0 +1,99 @@
+From e2583ca0844bd7a8ce4fc94da9ad67edf49ffd45 Mon Sep 17 00:00:00 2001
+From: Pekka Paalanen <pekka.paalanen@collabora.com>
+Upstream-Status: Backport
+Date: Fri, 14 May 2021 16:12:35 +0300
+Subject: [PATCH] libweston-desktop: add weston_desktop_xwayland_fini()
+
+This fixes the following leaks detected by ASan in
+./tests/test-alpha-blending:
+
+Direct leak of 176 byte(s) in 2 object(s) allocated from:
+    #0 0x7fb447880518 in calloc (/lib/x86_64-linux-gnu/libasan.so.5+0xe9518)
+    #1 0x7fb4432c12d7 in zalloc ../../git/weston/include/libweston/zalloc.h:38
+    #2 0x7fb4432c2ca6 in weston_desktop_xwayland_init ../../git/weston/libweston-desktop/xwayland.c:410
+    #3 0x7fb4432baadf in weston_desktop_create ../../git/weston/libweston-desktop/libweston-desktop.c:87
+    #4 0x7fb4432e1e1f in wet_shell_init ../../git/weston/tests/weston-test-desktop-shell.c:224
+    #5 0x7fb44775fddd in wet_load_shell ../../git/weston/compositor/main.c:956
+    #6 0x7fb447770db1 in wet_main ../../git/weston/compositor/main.c:3434
+    #7 0x56172c599279 in execute_compositor ../../git/weston/tests/weston-test-fixture-compositor.c:432
+    #8 0x56172c59cce5 in weston_test_harness_execute_as_client ../../git/weston/tests/weston-test-runner.c:528
+    #9 0x56172c58dc8c in fixture_setup ../../git/weston/tests/alpha-blending-test.c:65
+    #10 0x56172c58dd31 in fixture_setup_run_ ../../git/weston/tests/alpha-blending-test.c:67
+    #11 0x56172c59d29a in main ../../git/weston/tests/weston-test-runner.c:661
+    #12 0x7fb4473d509a in __libc_start_main ../csu/libc-start.c:308
+
+Indirect leak of 144 byte(s) in 2 object(s) allocated from:
+    #0 0x7fb447880518 in calloc (/lib/x86_64-linux-gnu/libasan.so.5+0xe9518)
+    #1 0x7fb4432bb592 in zalloc ../../git/weston/include/libweston/zalloc.h:38
+    #2 0x7fb4432bb882 in weston_desktop_client_create ../../git/weston/libweston-desktop/client.c:108
+    #3 0x7fb4432c2d0e in weston_desktop_xwayland_init ../../git/weston/libweston-desktop/xwayland.c:415
+    #4 0x7fb4432baadf in weston_desktop_create ../../git/weston/libweston-desktop/libweston-desktop.c:87
+    #5 0x7fb4432e1e1f in wet_shell_init ../../git/weston/tests/weston-test-desktop-shell.c:224
+    #6 0x7fb44775fddd in wet_load_shell ../../git/weston/compositor/main.c:956
+    #7 0x7fb447770db1 in wet_main ../../git/weston/compositor/main.c:3434
+    #8 0x56172c599279 in execute_compositor ../../git/weston/tests/weston-test-fixture-compositor.c:432
+    #9 0x56172c59cce5 in weston_test_harness_execute_as_client ../../git/weston/tests/weston-test-runner.c:528
+    #10 0x56172c58dc8c in fixture_setup ../../git/weston/tests/alpha-blending-test.c:65
+    #11 0x56172c58dd31 in fixture_setup_run_ ../../git/weston/tests/alpha-blending-test.c:67
+    #12 0x56172c59d29a in main ../../git/weston/tests/weston-test-runner.c:661
+    #13 0x7fb4473d509a in __libc_start_main ../csu/libc-start.c:308
+
+Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
+---
+ libweston-desktop/internal.h          |  2 ++
+ libweston-desktop/libweston-desktop.c |  2 ++
+ libweston-desktop/xwayland.c          | 16 ++++++++++++++++
+ 3 files changed, 20 insertions(+)
+
+diff --git a/libweston-desktop/internal.h b/libweston-desktop/internal.h
+index 7a815bd87..2606d279b 100644
+--- a/libweston-desktop/internal.h
++++ b/libweston-desktop/internal.h
+@@ -240,5 +240,7 @@ weston_desktop_wl_shell_create(struct weston_desktop *desktop,
+ void
+ weston_desktop_xwayland_init(struct weston_desktop *desktop);
++void
++weston_desktop_xwayland_fini(struct weston_desktop *desktop);
+ #endif /* WESTON_DESKTOP_INTERNAL_H */
+diff --git a/libweston-desktop/libweston-desktop.c b/libweston-desktop/libweston-desktop.c
+index c1efd2012..2b42ac7e3 100644
+--- a/libweston-desktop/libweston-desktop.c
++++ b/libweston-desktop/libweston-desktop.c
+@@ -95,6 +95,8 @@ weston_desktop_destroy(struct weston_desktop *desktop)
+       if (desktop == NULL)
+               return;
++      weston_desktop_xwayland_fini(desktop);
++
+       if (desktop->wl_shell != NULL)
+               wl_global_destroy(desktop->wl_shell);
+       if (desktop->xdg_shell_v6 != NULL)
+diff --git a/libweston-desktop/xwayland.c b/libweston-desktop/xwayland.c
+index 711c8a30c..c1c5fc4a7 100644
+--- a/libweston-desktop/xwayland.c
++++ b/libweston-desktop/xwayland.c
+@@ -423,3 +423,19 @@ weston_desktop_xwayland_init(struct weston_desktop *desktop)
+       compositor->xwayland = xwayland;
+       compositor->xwayland_interface = &weston_desktop_xwayland_interface;
+ }
++
++void
++weston_desktop_xwayland_fini(struct weston_desktop *desktop)
++{
++      struct weston_compositor *compositor = weston_desktop_get_compositor(desktop);
++      struct weston_desktop_xwayland *xwayland;
++
++      xwayland = compositor->xwayland;
++
++      weston_desktop_client_destroy(xwayland->client);
++      weston_layer_fini(&xwayland->layer);
++      free(xwayland);
++
++      compositor->xwayland = NULL;
++      compositor->xwayland_interface = NULL;
++}
+-- 
+GitLab
+
index f970d5f..c730150 100644 (file)
@@ -7,6 +7,10 @@ SRC_URI:append = "\
     file://0001-libweston-backend-drm-Re-order-gbm-destruction-at-DR.patch \
     file://0001-gl-renderer-Avoid-double-free-on-init-failure.patch \
     file://0001-libweston-Remove-source-repaint_timer-in-weston_comp.patch \
+    file://0001-libweston-desktop-rename-weston_desktop_client_destr.patch \
+    file://0002-libweston-desktop-introduce-weston_desktop_client_de.patch \
+    file://0003-libweston-desktop-add-weston_desktop_xwayland_fini.patch \
+    file://0001-libweston-add-weston_layer_fini.patch \
     "
 
 # Workaround for incorrect upstream definition