[PATCH weston] desktop-shell: remove surface listener when surface is destroyed
Pekka Paalanen
ppaalanen at gmail.com
Wed Jan 31 07:48:29 UTC 2018
On Wed, 31 Jan 2018 15:15:45 +0900
Tomohito Esaki <etom at igel.co.jp> wrote:
> There may be race condition between destroying surface and destroying
> output. If handle_output_destroy() is called after surface is destroyed,
> illegal memory access occurs when surface destroy signals is
> unregistered from the panel/background. This patch fixes this issue and
> removes unnecessary initialization for panel surface listener.
>
> Signed-off-by: Tomohito Esaki <etom at igel.co.jp>
> ---
> desktop-shell/shell.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
> index a2a93e2..de76ebe 100644
> --- a/desktop-shell/shell.c
> +++ b/desktop-shell/shell.c
> @@ -2939,6 +2939,7 @@ handle_background_surface_destroy(struct wl_listener *listener, void *data)
> container_of(listener, struct shell_output, background_surface_listener);
>
> weston_log("background surface gone\n");
> + wl_list_remove(&output->background_surface_listener.link);
> output->background_surface = NULL;
> }
>
> @@ -3023,6 +3024,7 @@ handle_panel_surface_destroy(struct wl_listener *listener, void *data)
> container_of(listener, struct shell_output, panel_surface_listener);
>
> weston_log("panel surface gone\n");
> + wl_list_remove(&output->panel_surface_listener.link);
> output->panel_surface = NULL;
> }
>
> @@ -4714,8 +4716,10 @@ handle_output_destroy(struct wl_listener *listener, void *data)
>
> shell_for_each_layer(shell, shell_output_destroy_move_layer, output);
>
> - wl_list_remove(&output_listener->panel_surface_listener.link);
> - wl_list_remove(&output_listener->background_surface_listener.link);
> + if (output_listener->panel_surface)
> + wl_list_remove(&output_listener->panel_surface_listener.link);
> + if (output_listener->background_surface)
> + wl_list_remove(&output_listener->background_surface_listener.link);
> wl_list_remove(&output_listener->destroy_listener.link);
> wl_list_remove(&output_listener->link);
> free(output_listener);
> @@ -4761,7 +4765,6 @@ create_shell_output(struct desktop_shell *shell,
> shell_output->output = output;
> shell_output->shell = shell;
> shell_output->destroy_listener.notify = handle_output_destroy;
> - wl_list_init(&shell_output->panel_surface_listener.link);
> wl_signal_add(&output->destroy_signal,
> &shell_output->destroy_listener);
> wl_list_insert(shell->output_list.prev, &shell_output->link);
Hi,
looks good, pushed with my R-b:
551b8054..bf31f6cf master -> master
Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20180131/0b66b066/attachment.sig>
More information about the wayland-devel
mailing list