egl/wayland: fix crash in dri2_initialize_wayland_swrast
authorJosé Expósito <jose.exposito89@gmail.com>
Thu, 3 Mar 2022 07:20:46 +0000 (08:20 +0100)
committerMarge Bot <emma+marge@anholt.net>
Mon, 7 Mar 2022 08:26:01 +0000 (08:26 +0000)
When "dri2_wl_formats_init" fails in "dri2_initialize_wayland_swrast",
the "dri2_display_destroy" function is called for clean up. However, the
"dri2_egl_display" was not associated with the display in its
"DriverData" field yet.

The following cast in "dri2_display_destroy":

  struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);

Expands to:

  _EGL_DRIVER_TYPECAST(drvname ## _display, _EGLDisplay, obj->DriverData)

Crashing.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13972>

src/egl/drivers/dri2/platform_wayland.c

index 242cf58..42bdb3b 100644 (file)
@@ -2605,11 +2605,12 @@ dri2_initialize_wayland_swrast(_EGLDisplay *disp)
    if (!dri2_dpy)
       return _eglError(EGL_BAD_ALLOC, "eglInitialize");
 
+   dri2_dpy->fd = -1;
+   disp->DriverData = (void *) dri2_dpy;
+
    if (dri2_wl_formats_init(&dri2_dpy->formats) < 0)
       goto cleanup;
 
-   dri2_dpy->fd = -1;
-   disp->DriverData = (void *) dri2_dpy;
    if (disp->PlatformDisplay == NULL) {
       dri2_dpy->wl_dpy = wl_display_connect(NULL);
       if (dri2_dpy->wl_dpy == NULL)