From 4c2a3dbe7b652e679c9228d7d8c81aa641bd968b Mon Sep 17 00:00:00 2001 From: duerpei Date: Mon, 14 Mar 2022 13:27:43 +0800 Subject: Fix potential memory leak of two pointers (xwayland and client) 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 Change-Id: I3b1140e88eadad9e378c2bb43221026e280ecd90 Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/meta-agl/+/27257 Reviewed-by: Marius Vlad Reviewed-by: Jan-Simon Moeller Tested-by: Jenkins Job builder account --- .../0001-libweston-add-weston_layer_fini.patch | 82 ++++++++++++++++++ ...esktop-rename-weston_desktop_client_destr.patch | 51 +++++++++++ ...esktop-introduce-weston_desktop_client_de.patch | 88 +++++++++++++++++++ ...-desktop-add-weston_desktop_xwayland_fini.patch | 99 ++++++++++++++++++++++ .../wayland/weston_8.0_aglcore.inc | 4 + 5 files changed, 324 insertions(+) create mode 100644 meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-add-weston_layer_fini.patch create mode 100644 meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-desktop-rename-weston_desktop_client_destr.patch create mode 100644 meta-agl-core/recipes-graphics/wayland/weston/0002-libweston-desktop-introduce-weston_desktop_client_de.patch create mode 100644 meta-agl-core/recipes-graphics/wayland/weston/0003-libweston-desktop-add-weston_desktop_xwayland_fini.patch (limited to 'meta-agl-core') 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 index 000000000..5b4fd04c4 --- /dev/null +++ b/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-add-weston_layer_fini.patch @@ -0,0 +1,82 @@ +From 8740037a93c7c4400cc381ecf3009d1e4014be07 Mon Sep 17 00:00:00 2001 +From: Pekka Paalanen +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 +--- + 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 index 000000000..5332a89b0 --- /dev/null +++ b/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-desktop-rename-weston_desktop_client_destr.patch @@ -0,0 +1,51 @@ +From 5a6604a7a2e52e5cd84c1f53724b3f7c325b5dff Mon Sep 17 00:00:00 2001 +From: Pekka Paalanen +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 +--- + 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 index 000000000..229c8506a --- /dev/null +++ b/meta-agl-core/recipes-graphics/wayland/weston/0002-libweston-desktop-introduce-weston_desktop_client_de.patch @@ -0,0 +1,88 @@ +From f53c05d3c2c19c139c52e9bd621c2654dd3dac69 Mon Sep 17 00:00:00 2001 +From: Pekka Paalanen +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 +--- + 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 ++#include + + #include + #include +@@ -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 index 000000000..1bcf5c7b4 --- /dev/null +++ b/meta-agl-core/recipes-graphics/wayland/weston/0003-libweston-desktop-add-weston_desktop_xwayland_fini.patch @@ -0,0 +1,99 @@ +From e2583ca0844bd7a8ce4fc94da9ad67edf49ffd45 Mon Sep 17 00:00:00 2001 +From: Pekka Paalanen +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 +--- + 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 + diff --git a/meta-agl-core/recipes-graphics/wayland/weston_8.0_aglcore.inc b/meta-agl-core/recipes-graphics/wayland/weston_8.0_aglcore.inc index f970d5f23..c73015024 100644 --- a/meta-agl-core/recipes-graphics/wayland/weston_8.0_aglcore.inc +++ b/meta-agl-core/recipes-graphics/wayland/weston_8.0_aglcore.inc @@ -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 -- cgit 1.2.3-korg