xwayland/glamor: Clean-up GBM's screen private on failure

If we bail out initializing GBM glamor backend, the screen private for
the GBM backend may remain, pointing at freed memory.

To avoid that issue, make sure to clear up the screen's private for the
GBM backend.

Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1785
Signed-off-by: Michel Dänzer <michel@daenzer.net>
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1768>
This commit is contained in:
Michel Dänzer 2025-02-04 11:09:29 +01:00 committed by Olivier Fourdan
parent 45c1d22ff6
commit b27b5cd5f3

View File

@ -631,6 +631,9 @@ xwl_glamor_gbm_cleanup(struct xwl_screen *xwl_screen)
{ {
struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen); struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
if (!xwl_gbm)
return;
if (xwl_gbm->device_name) if (xwl_gbm->device_name)
free(xwl_gbm->device_name); free(xwl_gbm->device_name);
drmFreeDevice(&xwl_gbm->device); drmFreeDevice(&xwl_gbm->device);
@ -643,6 +646,8 @@ xwl_glamor_gbm_cleanup(struct xwl_screen *xwl_screen)
if (xwl_screen->explicit_sync) if (xwl_screen->explicit_sync)
wp_linux_drm_syncobj_manager_v1_destroy(xwl_screen->explicit_sync); wp_linux_drm_syncobj_manager_v1_destroy(xwl_screen->explicit_sync);
dixSetPrivate(&xwl_screen->screen->devPrivates, &xwl_gbm_private_key,
NULL);
free(xwl_gbm); free(xwl_gbm);
} }