[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