Work around FreeType bug when glyph name buffer is too small.
Recent versions of FreeType do not correctly deal with glyph name buffers that are too small; work around this by declaring a buffer that can hold any PS name (127 bytes).
This commit is contained in:
parent
fa741cd4ff
commit
c80a08d6bf
|
@ -2412,6 +2412,19 @@ FcGlyphNameToUcs4 (FcChar8 *name)
|
||||||
return 0xffff;
|
return 0xffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Work around a bug in some FreeType versions which fail
|
||||||
|
* to correctly bounds check glyph name buffers and overwrite
|
||||||
|
* the stack. As Postscript names have a limit of 127 characters,
|
||||||
|
* this should be sufficient.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if FC_GLYPHNAME_MAXLEN < 127
|
||||||
|
# define FC_GLYPHNAME_BUFLEN 127
|
||||||
|
#else
|
||||||
|
# define FC_GLYPHNAME_BUFLEN FC_GLYPHNAME_MAXLEN
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Search through a font for a glyph by name. This is
|
* Search through a font for a glyph by name. This is
|
||||||
* currently a linear search as there doesn't appear to be
|
* currently a linear search as there doesn't appear to be
|
||||||
|
@ -2421,11 +2434,11 @@ static FT_UInt
|
||||||
FcFreeTypeGlyphNameIndex (FT_Face face, const FcChar8 *name)
|
FcFreeTypeGlyphNameIndex (FT_Face face, const FcChar8 *name)
|
||||||
{
|
{
|
||||||
FT_UInt gindex;
|
FT_UInt gindex;
|
||||||
FcChar8 name_buf[FC_GLYPHNAME_MAXLEN + 2];
|
FcChar8 name_buf[FC_GLYPHNAME_BUFLEN + 2];
|
||||||
|
|
||||||
for (gindex = 0; gindex < (FT_UInt) face->num_glyphs; gindex++)
|
for (gindex = 0; gindex < (FT_UInt) face->num_glyphs; gindex++)
|
||||||
{
|
{
|
||||||
if (FT_Get_Glyph_Name (face, gindex, name_buf, FC_GLYPHNAME_MAXLEN+1) == 0)
|
if (FT_Get_Glyph_Name (face, gindex, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0)
|
||||||
if (!strcmp ((char *) name, (char *) name_buf))
|
if (!strcmp ((char *) name, (char *) name_buf))
|
||||||
return gindex;
|
return gindex;
|
||||||
}
|
}
|
||||||
|
@ -2715,11 +2728,11 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
|
||||||
*/
|
*/
|
||||||
if (FcFreeTypeUseNames (face))
|
if (FcFreeTypeUseNames (face))
|
||||||
{
|
{
|
||||||
FcChar8 name_buf[FC_GLYPHNAME_MAXLEN + 2];
|
FcChar8 name_buf[FC_GLYPHNAME_BUFLEN + 2];
|
||||||
|
|
||||||
for (glyph = 0; glyph < (FT_UInt) face->num_glyphs; glyph++)
|
for (glyph = 0; glyph < (FT_UInt) face->num_glyphs; glyph++)
|
||||||
{
|
{
|
||||||
if (FT_Get_Glyph_Name (face, glyph, name_buf, FC_GLYPHNAME_MAXLEN+1) == 0)
|
if (FT_Get_Glyph_Name (face, glyph, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0)
|
||||||
{
|
{
|
||||||
ucs4 = FcGlyphNameToUcs4 (name_buf);
|
ucs4 = FcGlyphNameToUcs4 (name_buf);
|
||||||
if (ucs4 != 0xffff &&
|
if (ucs4 != 0xffff &&
|
||||||
|
|
Loading…
Reference in New Issue