+ 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. 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);
+ unblock_input ();
+ xfi->xfont = NULL;
+ }