summaryrefslogtreecommitdiff
path: root/src/xfont.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xfont.c')
-rw-r--r--src/xfont.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/xfont.c b/src/xfont.c
index 3295a62bbb0..525f00031c5 100644
--- a/src/xfont.c
+++ b/src/xfont.c
@@ -42,6 +42,7 @@ struct xfont_info
struct font font;
Display *display;
XFontStruct *xfont;
+ unsigned x_display_id;
};
/* Prototypes of support functions. */
@@ -808,6 +809,7 @@ xfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
font = XFONT_OBJECT (font_object);
((struct xfont_info *) font)->xfont = xfont;
((struct xfont_info *) font)->display = FRAME_X_DISPLAY (f);
+ ((struct xfont_info *) font)->x_display_id = FRAME_DISPLAY_INFO (f)->x_id;
font->pixel_size = pixel_size;
font->driver = &xfont_driver;
font->encoding_charset = encoding->id;
@@ -892,12 +894,20 @@ xfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
static void
xfont_close (struct font *font)
{
+ struct x_display_info *xdi;
struct xfont_info *xfi = (struct xfont_info *) font;
/* This function may be called from GC when X connection is gone
(Bug#16093), and an attempt to free font resources on invalid
- display may lead to X protocol errors or segfaults. */
- if (xfi->xfont && x_display_info_for_display (xfi->display))
+ display may lead to X protocol errors or segfaults. Moreover,
+ the memory referenced by 'Display *' pointer may be reused for
+ the logically different X connection after the previous display
+ connection was closed. That's why we also check whether font's
+ ID matches the one recorded in x_display_info for this display.
+ See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16069. */
+ if (xfi->xfont
+ && ((xdi = x_display_info_for_display (xfi->display))
+ && xfi->x_display_id == xdi->x_id))
{
block_input ();
XFreeFont (xfi->display, xfi->xfont);