From d4759df5bbe1a7e6e49ba72bf0a9e267c0d1e1d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 28 Jun 2019 11:36:08 +0200 Subject: [PATCH] surface-actor-x11: Assign X11 Display only if we have resources free_damage and detach_pixmap functions are called inside dispose and an object can be disposed multiple times, even when the display is already closed. So, don't try to deference a possibly null-pointer, assigning the xdisplay too early, as if the X11 related resources have been unset, the server might not be open anymore. In fact, we assume that if we have a damage or a pixmap set, the display is still open. https://gitlab.gnome.org/GNOME/mutter/merge_requests/660 (cherry picked from commit d7d97f247767ace2655f1fd2a7bbee0c0c8cfb50) --- src/compositor/meta-surface-actor-x11.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/compositor/meta-surface-actor-x11.c b/src/compositor/meta-surface-actor-x11.c index 3b66ed5aa..fd00721c9 100644 --- a/src/compositor/meta-surface-actor-x11.c +++ b/src/compositor/meta-surface-actor-x11.c @@ -69,11 +69,13 @@ free_damage (MetaSurfaceActorX11 *self) { MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaDisplay *display = priv->display; - Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); + Display *xdisplay; if (priv->damage == None) return; + xdisplay = meta_x11_display_get_xdisplay (display->x11_display); + meta_x11_error_trap_push (display->x11_display); XDamageDestroy (xdisplay, priv->damage); priv->damage = None; @@ -85,12 +87,14 @@ detach_pixmap (MetaSurfaceActorX11 *self) { MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaDisplay *display = priv->display; - Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); + Display *xdisplay; if (priv->pixmap == None) return; + xdisplay = meta_x11_display_get_xdisplay (display->x11_display); + /* Get rid of all references to the pixmap before freeing it; it's unclear whether * you are supposed to be able to free a GLXPixmap after freeing the underlying * pixmap, but it certainly doesn't work with current DRI/Mesa