On Mon, Aug 22, 2016 at 09:48:50AM +0200, Stencel, Joanna wrote:
> Segfault occurs when destroying EGL surface attached to already destroyed
> Wayland window. The fix is to set to NULL the pointer of surface's
> native window when wl_egl_destroy_window() is called.
> 
> Signed-off-by: Stencel, Joanna <joanna.sten...@intel.com>

LGTM
Reviewed-by: Eric Engestrom <e...@engestrom.ch>

> ---
>  src/egl/drivers/dri2/platform_wayland.c        | 15 +++++++++++++--
>  src/egl/wayland/wayland-egl/wayland-egl-priv.h |  1 +
>  src/egl/wayland/wayland-egl/wayland-egl.c      |  3 +++
>  3 files changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/src/egl/drivers/dri2/platform_wayland.c 
> b/src/egl/drivers/dri2/platform_wayland.c
> index d2f47cc..821d7c4 100644
> --- a/src/egl/drivers/dri2/platform_wayland.c
> +++ b/src/egl/drivers/dri2/platform_wayland.c
> @@ -119,6 +119,13 @@ resize_callback(struct wl_egl_window *wl_win, void *data)
>     (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable);
>  }
>  
> +static void
> +destroy_window_callback(void *data)
> +{
> +   struct dri2_egl_surface *dri2_surf = data;
> +   dri2_surf->wl_win = NULL;
> +}
> +
>  /**
>   * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface().
>   */
> @@ -160,6 +167,7 @@ dri2_wl_create_surface(_EGLDriver *drv, _EGLDisplay *disp,
>  
>     dri2_surf->wl_win->private = dri2_surf;
>     dri2_surf->wl_win->resize_callback = resize_callback;
> +   dri2_surf->wl_win->destroy_window_callback = destroy_window_callback;
>  
>     dri2_surf->base.Width = window->width;
>     dri2_surf->base.Height = window->height;
> @@ -258,8 +266,11 @@ dri2_wl_destroy_surface(_EGLDriver *drv, _EGLDisplay 
> *disp, _EGLSurface *surf)
>     if (dri2_surf->throttle_callback)
>        wl_callback_destroy(dri2_surf->throttle_callback);
>  
> -   dri2_surf->wl_win->private = NULL;
> -   dri2_surf->wl_win->resize_callback = NULL;
> +   if (dri2_surf->wl_win) {
> +      dri2_surf->wl_win->private = NULL;
> +      dri2_surf->wl_win->resize_callback = NULL;
> +      dri2_surf->wl_win->destroy_window_callback = NULL;
> +   }
>  
>     free(surf);
>  
> diff --git a/src/egl/wayland/wayland-egl/wayland-egl-priv.h 
> b/src/egl/wayland/wayland-egl/wayland-egl-priv.h
> index 74a1552..eae1224 100644
> --- a/src/egl/wayland/wayland-egl/wayland-egl-priv.h
> +++ b/src/egl/wayland/wayland-egl/wayland-egl-priv.h
> @@ -27,6 +27,7 @@ struct wl_egl_window {
>  
>       void *private;
>       void (*resize_callback)(struct wl_egl_window *, void *);
> +     void (*destroy_window_callback)(void *);
>  };
>  
>  #ifdef  __cplusplus
> diff --git a/src/egl/wayland/wayland-egl/wayland-egl.c 
> b/src/egl/wayland/wayland-egl/wayland-egl.c
> index 80a5be5..4a4701a 100644
> --- a/src/egl/wayland/wayland-egl/wayland-egl.c
> +++ b/src/egl/wayland/wayland-egl/wayland-egl.c
> @@ -66,6 +66,7 @@ wl_egl_window_create(struct wl_surface *surface,
>       egl_window->surface = surface;
>       egl_window->private = NULL;
>       egl_window->resize_callback = NULL;
> +     egl_window->destroy_window_callback = NULL;
>       wl_egl_window_resize(egl_window, width, height, 0, 0);
>       egl_window->attached_width  = 0;
>       egl_window->attached_height = 0;
> @@ -76,6 +77,8 @@ wl_egl_window_create(struct wl_surface *surface,
>  WL_EGL_EXPORT void
>  wl_egl_window_destroy(struct wl_egl_window *egl_window)
>  {
> +     if (egl_window->destroy_window_callback)
> +             egl_window->destroy_window_callback(egl_window->private);
>       free(egl_window);
>  }
>  
> -- 
> 1.9.1
> 
> --------------------------------------------------------------------
> 
> Intel Technology Poland sp. z o.o.
> ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII 
> Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 
> 957-07-52-316 | Kapital zakladowy 200.000 PLN.
> 
> Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i 
> moze zawierac informacje poufne. W razie przypadkowego otrzymania tej 
> wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; 
> jakiekolwiek
> przegladanie lub rozpowszechnianie jest zabronione.
> This e-mail and any attachments may contain confidential material for the 
> sole use of the intended recipient(s). If you are not the intended recipient, 
> please contact the sender and delete all copies; any review or distribution by
> others is strictly prohibited.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to