diff options
author | Keith Packard <keithp@keithp.com> | 2014-04-25 20:25:56 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2014-05-05 13:18:22 -0700 |
commit | 4711182033ec579caff8c930d420f90ecdbe54cf (patch) | |
tree | a478e9cd9678d93fb1d3d24bc0de35a6a09be1a7 /glamor | |
parent | 91767a32874790f8a8c7340be0e81a0b719ca4f6 (diff) |
glamor: Work around libXfont when it fails to use defaultChar
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, the bitmapGetGlyphs function in libXfont versions up
through 1.4.7 will return zero glyphs if there is no 0th row.
While this is a bug in libXfont and should be fixed there, 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@keithp.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'glamor')
-rw-r--r-- | glamor/glamor_text.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/glamor/glamor_text.c b/glamor/glamor_text.c index fdee08ebc..6e02b9aa8 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,28 @@ 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. There's a bug in libXfont through + * version 1.4.7 which would cause it to fail when the font is + * a 2D font without a first row, and the application sends a + * 1-d request. In this case, libXfont would return zero + * glyphs, even when the font had a default character. + * + * It's easy enough for us to work around that bug here by + * simply checking the returned nglyphs and falling through to + * the one-at-a-time code below. Not doing this check would + * result in uninitialized memory accesses in the rendering code. + */ + 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; } } |