[PATCH weston] xwm: Fix a weston crash when a window surface is created after unmap
Pekka Paalanen
ppaalanen at gmail.com
Fri Apr 10 00:04:03 PDT 2015
On Thu, 9 Apr 2015 14:48:22 -0500
Derek Foreman <derekf at osg.samsung.com> wrote:
> If windows are created and quickly destroyed it's possible that they'll be
> on the unpaired window list at the time of surface creation. The surface
> destroy listener for that surface isn't properly freed and a crash happens
> some time later.
>
> This patch removes the window from the unpaired list during unmap, so we
> should never get to the destroy handler with a surface destroy listener set.
>
> Just in case there's another path to that failure, I've also removed the
> surface destroy listener in the destory handler.
>
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> ---
>
> This applies on top of my earlier xwm patch (Add and use helper function...)
> and stops a very hard to trigger segfault in weston.
>
> xwayland/window-manager.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
> index 5d22ded..cab7e20 100644
> --- a/xwayland/window-manager.c
> +++ b/xwayland/window-manager.c
> @@ -1001,6 +1001,14 @@ weston_wm_handle_unmap_notify(struct weston_wm *wm, xcb_generic_event_t *event)
> if (!wm_lookup_window(wm, unmap_notify->window, &window))
> return;
>
> + if (window->surface_id) {
> + /* Make sure we're not on the unpaired surface list or we
> + * could be assigned a surface during surface creation that
> + * was mapped before this unmap request.
> + */
> + wl_list_remove(&window->link);
> + window->surface_id = 0;
> + }
> if (wm->focus_window == window)
> wm->focus_window = NULL;
> if (window->surface)
> @@ -1207,6 +1215,9 @@ weston_wm_window_destroy(struct weston_wm_window *window)
> if (window->surface_id)
> wl_list_remove(&window->link);
>
> + if (window->surface)
> + wl_list_remove(&window->surface_destroy_listener.link);
> +
> hash_table_remove(window->wm->window_hash, window->id);
> free(window);
> }
Acked by Jasper in IRC, R-b me for details, pushed.
90f23ca..9a0b2b5 master -> master
Thanks,
pq
More information about the wayland-devel
mailing list