egl/wayland-egl: Fix for segfault in dri2_wl_destroy_surface.
authorStencel, Joanna <joanna.stencel@intel.com>
Mon, 22 Aug 2016 07:48:50 +0000 (09:48 +0200)
committerEmil Velikov <emil.l.velikov@gmail.com>
Wed, 24 Aug 2016 09:18:13 +0000 (10:18 +0100)
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.

Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Stencel, Joanna <joanna.stencel@intel.com>
Reviewed-by: Eric Engestrom <eric@engestrom.ch>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
src/egl/wayland/wayland-egl/wayland-egl-priv.h
src/egl/wayland/wayland-egl/wayland-egl.c

index f1e3ba283097064c849ae2d97f9501b607013d37..c91f9cdf0fbcc994fefada6439536dc1f1810de6 100644 (file)
@@ -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
index 80a5be5e32cd06d6139ddd53234a41725d655f0a..4a4701a2de7f378703c9a5f36c6787789621cb17 100644 (file)
@@ -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);
 }