[PATCH 1/3] glamor: Handle unexpected GetGlyphs results better

Eric Anholt eric at anholt.net
Fri Apr 25 17:39:26 PDT 2014


Keith Packard <keithp at keithp.com> writes:

> GetGlyphs is supposed to always return the full list of characters
> when there is a default character available. However, if an
> application opens a 16-bit two dimensional font and then draws with
> 8-bit requests, GetGlyphs will return zero glyphs if there is no 0th
> row. This is probably a bug in GetGlyphs, but it's easy to protect
> glamor from it by simply falling through to the case that handles
> GetGlyphs failures for fonts without a default character.
>
> Signed-off-by: Keith Packard <keithp at keithp.com>
> ---
>  glamor/glamor_text.c | 28 ++++++++++++++++++----------
>  1 file changed, 18 insertions(+), 10 deletions(-)
>
> diff --git a/glamor/glamor_text.c b/glamor/glamor_text.c
> index 395116d..4db2adc 100644
> --- a/glamor/glamor_text.c
> +++ b/glamor/glamor_text.c
> @@ -37,6 +37,7 @@ glamor_get_glyphs(FontPtr font, glamor_font_t *glamor_font,
>      unsigned long nglyphs;
>      FontEncoding encoding;
>      int char_step;
> +    int c;
>  
>      if (sixteen) {
>          char_step = 2;
> @@ -49,7 +50,7 @@ glamor_get_glyphs(FontPtr font, glamor_font_t *glamor_font,
>          encoding = Linear8Bit;
>      }
>  
> -    /* If the font has a default character, then we don't have to
> +    /* If the font has a default character, then we shouldn't have to
>       * worry about missing glyphs, so just get the whole string all at
>       * once. Otherwise, we have to fetch chars one at a time to notice
>       * missing ones.
> @@ -57,15 +58,22 @@ glamor_get_glyphs(FontPtr font, glamor_font_t *glamor_font,
>      if (glamor_font->default_char) {
>          GetGlyphs(font, (unsigned long) count, (unsigned char *) chars,
>                    encoding, &nglyphs, charinfo);
> -    } else {
> -        int c;
> -        for (c = 0; c < count; c++) {
> -            GetGlyphs(font, 1, (unsigned char *) chars,
> -                      encoding, &nglyphs, &charinfo[c]);
> -            if (!nglyphs)
> -                charinfo[c] = NULL;
> -            chars += char_step;
> -        }
> +
> +        /* Make sure it worked -- it may fail
> +         * if the font is a 2D font without a first row,
> +         * and the application sends a 1-d request,
> +         * the font will actually return zero glyphs
> +         */
> +        if (nglyphs == count)
> +            return;

You previously said you were going to update the comment here (and the
commit message), but it doesn't look like that happened.

I think the bug should just get fixed in libXfont and have the server
rely on it.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg-devel/attachments/20140425/3c8034e7/attachment.sig>


More information about the xorg-devel mailing list