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