Handle broken FNT files which don't have a trailing NULL byte

in the face name string.

* src/winfnt/winfnt.h (FNT_FontRec): New member `family_name'.
* src/winfnt/winfnt.c (fnt_font_done): Free font->family_name.
(FNT_Face_Init): Append a final zero byte to the font face name.

* src/sfnt/ttload.c (tt_face_load_sfnt_header): Fix change from
2004-03-19.
This commit is contained in:
Werner Lemberg 2004-04-01 20:35:57 +00:00
parent aeaafaa291
commit 611eaa7f3f
4 changed files with 43 additions and 12 deletions

View File

@ -1,3 +1,17 @@
2004-03-31 Werner Lemberg <wl@gnu.org>
Handle broken FNT files which don't have a trailing NULL byte
in the face name string.
* src/winfnt/winfnt.h (FNT_FontRec): New member `family_name'.
* src/winfnt/winfnt.c (fnt_font_done): Free font->family_name.
(FNT_Face_Init): Append a final zero byte to the font face name.
2004-03-30 Werner Lemberg <wl@gnu.org>
* src/sfnt/ttload.c (tt_face_load_sfnt_header): Fix change from
2004-03-19.
2004-03-27 Werner Lemberg <wl@gnu.org> 2004-03-27 Werner Lemberg <wl@gnu.org>
* src/base/descrip.mms (OBJS): Add ftbbox.obj. * src/base/descrip.mms (OBJS): Add ftbbox.obj.

View File

@ -357,11 +357,6 @@
FT_READ_LONG( format_tag ) ) FT_READ_LONG( format_tag ) )
goto Exit; goto Exit;
} }
else if ( face_index > 0 )
{
error = SFNT_Err_Bad_Argument;
goto Exit;
}
/* the format tag was read, now check the rest of the header */ /* the format tag was read, now check the rest of the header */
sfnt->format_tag = format_tag; sfnt->format_tag = format_tag;
@ -376,8 +371,13 @@
{ {
FT_TRACE2(( "tt_face_load_sfnt_header: file is not SFNT!\n" )); FT_TRACE2(( "tt_face_load_sfnt_header: file is not SFNT!\n" ));
error = SFNT_Err_Unknown_File_Format; error = SFNT_Err_Unknown_File_Format;
goto Exit;
} }
/* disallow face index values > 0 for non-TTC files */
if ( format_tag != TTAG_ttcf && face_index > 0 )
error = SFNT_Err_Bad_Argument;
Exit: Exit:
return error; return error;
} }

View File

@ -121,6 +121,7 @@
if ( font->fnt_frame ) if ( font->fnt_frame )
FT_FRAME_RELEASE( font->fnt_frame ); FT_FRAME_RELEASE( font->fnt_frame );
FT_FREE( font->family_name );
FT_FREE( font ); FT_FREE( font );
face->font = 0; face->font = 0;
@ -436,6 +437,7 @@
{ {
FT_Face root = FT_FACE( face ); FT_Face root = FT_FACE( face );
FNT_Font font = face->font; FNT_Font font = face->font;
FT_PtrDist family_size;
root->face_flags = FT_FACE_FLAG_FIXED_SIZES | root->face_flags = FT_FACE_FLAG_FIXED_SIZES |
@ -506,8 +508,22 @@
root->num_glyphs = font->header.last_char - root->num_glyphs = font->header.last_char -
font->header.first_char + 1 + 1; font->header.first_char + 1 + 1;
root->family_name = (FT_String*)font->fnt_frame + /* Some broken fonts don't delimit the face name with a final */
font->header.face_name_offset; /* NULL byte -- the frame is erroneously one byte too small. */
/* We thus allocate one more byte, setting it explicitly to */
/* zero. */
family_size = font->header.file_size - font->header.face_name_offset;
if ( FT_ALLOC( font->family_name, family_size + 1 ) )
goto Fail;
FT_MEM_COPY( font->family_name,
font->fnt_frame + font->header.face_name_offset,
family_size );
font->family_name[family_size] = '\0';
if ( FT_REALLOC( font->family_name,
family_size,
ft_strlen( font->family_name ) + 1 ) )
goto Fail;
root->family_name = font->family_name;
root->style_name = (char *)"Regular"; root->style_name = (char *)"Regular";
if ( root->style_flags & FT_STYLE_FLAG_BOLD ) if ( root->style_flags & FT_STYLE_FLAG_BOLD )
@ -520,9 +536,9 @@
else if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) else if ( root->style_flags & FT_STYLE_FLAG_ITALIC )
root->style_name = (char *)"Italic"; root->style_name = (char *)"Italic";
} }
goto Exit;
Fail: Fail:
if ( error )
FNT_Face_Done( face ); FNT_Face_Done( face );
Exit: Exit:

View File

@ -4,7 +4,7 @@
/* */ /* */
/* FreeType font driver for Windows FNT/FON files */ /* FreeType font driver for Windows FNT/FON files */
/* */ /* */
/* Copyright 1996-2001, 2002, 2003 by */ /* Copyright 1996-2001, 2002, 2003, 2004 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */ /* */
/* This file is part of the FreeType project, and may only be used, */ /* This file is part of the FreeType project, and may only be used, */
@ -79,6 +79,7 @@ FT_BEGIN_HEADER
FT_Byte* fnt_frame; FT_Byte* fnt_frame;
FT_ULong fnt_size; FT_ULong fnt_size;
FT_String* family_name;
} FNT_FontRec, *FNT_Font; } FNT_FontRec, *FNT_Font;