[PATCH] glamor: Handle unexpected GetGlyphs results better
Keith Packard
keithp at keithp.com
Fri Apr 18 14:34:14 PDT 2014
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 0e4b74c..5307979 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;
}
}
--
1.9.2
More information about the xorg-devel
mailing list