Subject: Re: bug#30874: 27.0.50; Emacs crashes

From: Eli Zaretskii <[email-masked]>
Date: Sat, 31 Mar 2018 17:59:21 +0300

> From: Robert Pluim <[email-masked]>
> Cc: [email-masked],  [email-masked]
> Date: Sat, 31 Mar 2018 15:55:13 +0200
> 
> Iʼm testing the following, which fixes the 20890 crash for me when
> using Cairo.
> 
> diff --git i/src/ftfont.c w/src/ftfont.c
> index c2e093e633..89c07e1f21 100644
> --- i/src/ftfont.c
> +++ w/src/ftfont.c
> @@ -1242,6 +1242,11 @@ ftfont_close (struct font *font)
>    struct ftfont_info *ftfont_info = (struct ftfont_info *) font;
>    Lisp_Object val, cache;
>  
> +#ifdef USE_CAIRO
> +  /* Bug#20890 workaround.  */
> +  if (gc_in_progress)
> +    return;
> +#endif
>    val = Fcons (font->props[FONT_FILE_INDEX], make_number (ftfont_info->index));
>    cache = ftfont_lookup_cache (val, FTFONT_CACHE_FOR_FACE);
>    eassert (CONSP (cache));

This LGTM, thanks.

> >> > Also, we should probably condition this by HAVE_XFT, since AFAIU the
> >> > problem is only relevant to that build?
> 
> This is what Iʼm using at the moment. I can put the variable in
> syms_of_xftfont if you prefer.
> 
> diff --git i/src/ftfont.c w/src/ftfont.c
> index c2e093e633..2190186940 100644
> --- i/src/ftfont.c
> +++ w/src/ftfont.c
> @@ -764,6 +764,13 @@ ftfont_spec_pattern (Lisp_Object spec, char *otlayout, struct OpenTypeSpec **ots
>    if (scalable >= 0
>        && ! FcPatternAddBool (pattern, FC_SCALABLE, scalable ? FcTrue : FcFalse))
>      goto err;
> +#ifdef HAVE_XFT
> +  /* We really don't like color fonts, they cause Xft crashes.  See
> +     bug#30874.  */
> +  if (Vxft_ignore_color_fonts
> +      && ! FcPatternAddBool(pattern, FC_COLOR, FcFalse))
> +    goto err;
> +#endif
>  
>    goto finish;
>  
> @@ -2735,6 +2742,14 @@ syms_of_ftfont (void)
>    DEFSYM (Qsans, "sans");
>    DEFSYM (Qsans__serif, "sans serif");
>  
> +#ifdef HAVE_XFT
> +  DEFVAR_BOOL ("xft-ignore-color-fonts",
> +	       Vxft_ignore_color_fonts,
> +     doc: /* Non-nil means don't query fontconfig for color fonts,
> +since they often cause Xft crashes. bug#30874.  */);
> +  Vxft_ignore_color_fonts = 1;
> +#endif
> +
>    staticpro (&freetype_font_cache);
>    freetype_font_cache = list1 (Qt);

It can stay in ftfont.c, but please make the second hunk
unconditional, so that the variable is known and available in all the
builds, just say in the doc string that this variable has effect only
on the xftfont backend.  I have bad experience with variables that are
only defined in some configurations: it means both trouble for users
who use more than one configuration and more maintenance headaches.
Come to think of it, maybe it's best to move DEFVAR_BOOL to font.c,
for that very reason.

Thanks.