diff options
Diffstat (limited to 'src/xfont.c')
-rw-r--r-- | src/xfont.c | 14 |
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); |