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
This commit is contained in:
Marco Trevisan (Treviño) 2019-06-28 11:36:08 +02:00
parent 7776941b89
commit d7d97f2477

View File

@ -71,11 +71,13 @@ static void
free_damage (MetaSurfaceActorX11 *self) free_damage (MetaSurfaceActorX11 *self)
{ {
MetaDisplay *display = self->display; MetaDisplay *display = self->display;
Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); Display *xdisplay;
if (self->damage == None) if (self->damage == None)
return; return;
xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
meta_x11_error_trap_push (display->x11_display); meta_x11_error_trap_push (display->x11_display);
XDamageDestroy (xdisplay, self->damage); XDamageDestroy (xdisplay, self->damage);
self->damage = None; self->damage = None;
@ -86,12 +88,14 @@ static void
detach_pixmap (MetaSurfaceActorX11 *self) detach_pixmap (MetaSurfaceActorX11 *self)
{ {
MetaDisplay *display = self->display; MetaDisplay *display = self->display;
Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self));
Display *xdisplay;
if (self->pixmap == None) if (self->pixmap == None)
return; 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 /* 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 * 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 * pixmap, but it certainly doesn't work with current DRI/Mesa