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 <[email protected]> --- 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; + } + + for (c = 0; c < count; c++) { + GetGlyphs(font, 1, (unsigned char *) chars, + encoding, &nglyphs, &charinfo[c]); + if (!nglyphs) + charinfo[c] = NULL; + chars += char_step; } } -- 2.0.0.rc0 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
