ref: 2fbf7e439f06416d195435baa89c403f2044c2dd
parent: d66ea312f65ccbbffe1cfe6e4c9b35a7e80f831b
author: Werner Lemberg <[email protected]>
date: Thu Jun 1 20:01:14 EDT 2000
Added a lot of error checking code to the exported functions in the `base' subdir (not complete yet).
--- a/src/base/ftextend.c
+++ b/src/base/ftextend.c
@@ -122,6 +122,12 @@
FT_Extension_Registry* registry;
+ if ( !driver )
+ return FT_Err_Invalid_Driver_Handle;
+
+ if ( !class )
+ return FT_Err_Invalid_Argument;
+
registry = (FT_Extension_Registry*)driver->extensions;
if ( registry )
{
@@ -172,6 +178,9 @@
FT_Extension_Registry* registry;
+ if ( !face || !extension_id || !extension_interface )
+ return 0;
+
registry = (FT_Extension_Registry*)face->driver->extensions;
if ( registry && face->extensions )
{
@@ -190,6 +199,7 @@
/* could not find the extension id */
*extension_interface = 0;
+
return 0;
}
--- a/src/base/ftglyph.c
+++ b/src/base/ftglyph.c
@@ -86,7 +86,7 @@
/* */
/* <Note> */
/* If the font contains glyph outlines, these will be automatically */
- /* converted to a bitmap according to the value of `grays' */
+ /* converted to a bitmap according to the value of `grays'. */
/* */
/* If `grays' is set to 0, the result is a 1-bit monochrome bitmap */
/* otherwise, it is an 8-bit gray-level bitmap. */
@@ -121,6 +121,12 @@
FT_Pos origin_y = 0;
+ if ( !face )
+ return FT_Err_Invalid_Face_Handle;
+
+ if ( !abitglyph )
+ return FT_Err_Invalid_Argument;
+
*abitglyph = 0;
if ( origin )
@@ -304,6 +310,11 @@
FT_OutlineGlyph glyph;
+ /* test for valid face delayed to FT_Load_Glyph() */
+
+ if ( !vecglyph )
+ return FT_Err_Invalid_Argument;
+
*vecglyph = 0;
/* check that NO_OUTLINE and NO_RECURSE are not set */
@@ -394,6 +405,9 @@
FT_Matrix* matrix,
FT_Vector* delta )
{
+ if ( !face )
+ return;
+
face->transform_flags = 0;
if ( !matrix )
@@ -496,6 +510,9 @@
FT_EXPORT_FUNC( void ) FT_Glyph_Get_Box( FT_Glyph glyph,
FT_BBox* box )
{
+ if ( !box )
+ return;
+
box->xMin = box->xMax = 0;
box->yMin = box->yMax = 0;
@@ -529,7 +546,7 @@
default:
;
- }
+ }
}
--- a/src/base/ftgrays.c
+++ b/src/base/ftgrays.c
@@ -1632,7 +1632,7 @@
return error;
Invalid_Outline:
- return -1;
+ return ErrRaster_Invalid_Outline;
}
#endif /* _STANDALONE_ */
@@ -1797,11 +1797,11 @@
return 0;
if ( !outline || !outline->contours || !outline->points )
- return -1;
+ return ErrRaster_Invalid_Outline;
if ( outline->n_points !=
outline->contours[outline->n_contours - 1] + 1 )
- return -1;
+ return ErrRaster_Invalid_Outline;
if ( !target_map || !target_map->buffer )
return -1;
--- a/src/base/ftinit.c
+++ b/src/base/ftinit.c
@@ -74,9 +74,11 @@
/* */
FT_EXPORT_FUNC( void ) FT_Default_Drivers( FT_Library library )
{
- FT_Error error;
- const FT_DriverInterface* *cur;
+ FT_Error error;
+ const FT_DriverInterface** cur;
+
+ /* test for valid library delayed to FT_Add_Driver() */
cur = ft_default_drivers;
while ( *cur )
--- a/src/base/ftmm.c
+++ b/src/base/ftmm.c
@@ -24,10 +24,13 @@
{
FT_Error error;
+
+ if ( !face )
+ return FT_Err_Invalid_Face_Handle;
error = FT_Err_Invalid_Argument;
- if ( face && FT_HAS_MULTIPLE_MASTERS( face ) )
+ if ( FT_HAS_MULTIPLE_MASTERS( face ) )
{
FT_Driver driver = face->driver;
FT_Get_MM_Func func;
@@ -51,9 +54,12 @@
FT_Error error;
+ if ( !face )
+ return FT_Err_Invalid_Face_Handle;
+
error = FT_Err_Invalid_Argument;
- if ( face && FT_HAS_MULTIPLE_MASTERS( face ) )
+ if ( FT_HAS_MULTIPLE_MASTERS( face ) )
{
FT_Driver driver = face->driver;
FT_Set_MM_Design_Func func;
@@ -77,9 +83,12 @@
FT_Error error;
+ if ( !face )
+ return FT_Err_Invalid_Face_Handle;
+
error = FT_Err_Invalid_Argument;
- if ( face && FT_HAS_MULTIPLE_MASTERS( face ) )
+ if ( FT_HAS_MULTIPLE_MASTERS( face ) )
{
FT_Driver driver = face->driver;
FT_Set_MM_Blend_Func func;
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -217,6 +217,8 @@
/* <Description> */
/* Creates a new input stream object from an FT_Open_Args structure. */
/* */
+ /* <Note> */
+ /* The function expects a valid `astream' parameter. */
static
FT_Error ft_new_input_stream( FT_Library library,
FT_Open_Args* args,
@@ -227,6 +229,12 @@
FT_Stream stream;
+ if ( !library )
+ return FT_Err_Invalid_Library_Handle;
+
+ if ( !args )
+ return FT_Err_Invalid_Argument;
+
*astream = 0;
memory = library->memory;
if ( ALLOC( stream, sizeof ( *stream ) ) )
@@ -279,7 +287,7 @@
/* */
FT_EXPORT_FUNC( void ) FT_Done_Stream( FT_Stream stream )
{
- if ( stream->close )
+ if ( stream && stream->close )
stream->close( stream );
}
@@ -425,6 +433,9 @@
FT_Int n;
+ if ( !library )
+ return 0;
+
for ( n = 0; n < FT_MAX_GLYPH_FORMATS; n++ )
{
FT_Raster_Funcs* funcs = &library->raster_funcs[n];
@@ -471,7 +482,7 @@
FT_EXPORT_FUNC( FT_Error ) FT_Set_Raster( FT_Library library,
FT_Raster_Funcs* raster_funcs )
{
- FT_Glyph_Format glyph_format = raster_funcs->glyph_format;
+ FT_Glyph_Format glyph_format;
FT_Raster_Funcs* funcs;
FT_Raster raster;
FT_Error error;
@@ -478,6 +489,14 @@
FT_Int n, index;
+ if ( !library )
+ return FT_Err_Invalid_Library_Handle;
+
+ if ( !raster_funcs )
+ return FT_Err_Invalid_Argument;
+
+ glyph_format = raster_funcs->glyph_format;
+
if ( glyph_format == ft_glyph_format_none )
return FT_Err_Invalid_Argument;
@@ -551,13 +570,21 @@
FT_Library library,
FT_Raster_Funcs* raster_funcs )
{
- FT_Glyph_Format glyph_format = raster_funcs->glyph_format;
+ FT_Glyph_Format glyph_format;
FT_Error error;
FT_Int n;
+ if ( !library )
+ return FT_Err_Invalid_Library_Handle;
+
error = FT_Err_Invalid_Argument;
+ if ( !raster_funcs )
+ goto Exit;
+
+ glyph_format = raster_funcs->glyph_format;
+
if ( glyph_format == ft_glyph_format_none )
goto Exit;
@@ -611,8 +638,11 @@
FT_Raster raster;
+ if ( !library )
+ return FT_Err_Invalid_Library_Handle;
+
raster = FT_Get_Raster( library, format, &funcs );
- if ( raster && funcs.raster_set_mode )
+ if ( raster && args && funcs.raster_set_mode )
return funcs.raster_set_mode( raster, mode, args );
else
return FT_Err_Invalid_Argument;
@@ -645,7 +675,8 @@
FT_UInt hook_index,
FT_DebugHook_Func debug_hook )
{
- if ( hook_index <
+ if ( library && debug_hook &&
+ hook_index <
( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) )
library->debug_hooks[hook_index] = debug_hook;
}
@@ -673,10 +704,13 @@
FT_EXPORT_FUNC( FT_Error ) FT_New_Library( FT_Memory memory,
FT_Library* alibrary )
{
- FT_Library library = 0;
- FT_Error error;
+ FT_Library library = 0;
+ FT_Error error;
+ if ( !memory )
+ return FT_Err_Invalid_Argument;
+
/* first of all, allocate the library object */
if ( ALLOC( library, sizeof ( *library ) ) )
return error;
@@ -804,9 +838,12 @@
FT_Memory memory;
- if ( !library || !driver_interface )
+ if ( !library )
return FT_Err_Invalid_Library_Handle;
+ if ( !driver_interface )
+ return FT_Err_Invalid_Argument;
+
memory = library->memory;
error = FT_Err_Ok;
@@ -1041,6 +1078,11 @@
FT_Open_Args args;
+ /* test for valid `library' and `aface' delayed to FT_Open_Face() */
+
+ if ( !pathname )
+ return FT_Err_Invalid_Argument;
+
args.flags = ft_open_pathname;
args.pathname = (char*)pathname;
@@ -1097,6 +1139,11 @@
FT_Open_Args args;
+ /* test for valid `library' and `face' delayed to FT_Open_Face() */
+
+ if ( !file_base )
+ return FT_Err_Invalid_Argument;
+
args.flags = ft_open_memory;
args.memory_base = file_base;
args.memory_size = file_size;
@@ -1158,11 +1205,14 @@
FT_ListNode node = 0;
- *aface = 0;
+ /* test for valid `library' and `args' delayed to */
+ /* ft_new_input_stream() */
- if ( !library )
- return FT_Err_Invalid_Handle;
+ if ( !aface )
+ return FT_Err_Invalid_Argument;
+ *aface = 0;
+
/* create input stream */
error = ft_new_input_stream( library, args, &stream );
if ( error )
@@ -1328,6 +1378,11 @@
FT_Open_Args open;
+ /* test for valid `face' delayed to FT_Attach_Stream() */
+
+ if ( !filepathname )
+ return FT_Err_Invalid_Argument;
+
open.flags = ft_open_pathname;
open.pathname = (char*)filepathname;
@@ -1371,11 +1426,16 @@
FTDriver_getInterface get_interface;
- if ( !face || !face->driver )
- return FT_Err_Invalid_Handle;
+ /* test for valid `parameters' delayed to ft_new_input_stream() */
+ if ( !face )
+ return FT_Err_Invalid_Face_Handle;
+
driver = face->driver;
- error = ft_new_input_stream( driver->library, parameters, &stream );
+ if ( !driver )
+ return FT_Err_Invalid_Driver_Handle;
+
+ error = ft_new_input_stream( driver->library, parameters, &stream );
if ( error )
goto Exit;
@@ -1427,10 +1487,13 @@
FT_ListNode node;
- if ( !face || !face->driver )
+ if ( !face )
return FT_Err_Invalid_Face_Handle;
- driver = face->driver;
+ driver = face->driver;
+ if ( !driver )
+ return FT_Err_Invalid_Driver_Handle;
+
interface = &driver->interface;
memory = driver->memory;
@@ -1482,11 +1545,18 @@
FT_ListNode node = 0;
- if ( !face || !face->driver )
+ if ( !face )
return FT_Err_Invalid_Face_Handle;
- *asize = 0;
- driver = face->driver;
+ if ( !asize )
+ return FT_Err_Invalid_Argument;
+
+ *asize = 0;
+
+ driver = face->driver;
+ if ( !driver )
+ return FT_Err_Invalid_Driver_Handle;
+
interface = &driver->interface;
memory = face->memory;
@@ -1544,10 +1614,14 @@
FT_ListNode node;
- if ( !size || !size->face )
+ if ( !size )
return FT_Err_Invalid_Size_Handle;
- driver = size->face->driver;
+ face = size->face;
+ if ( !face )
+ return FT_Err_Invalid_Face_Handle;
+
+ driver = face->driver;
if ( !driver )
return FT_Err_Invalid_Driver_Handle;
@@ -1554,7 +1628,6 @@
memory = driver->memory;
error = FT_Err_Ok;
- face = size->face;
node = FT_List_Find( &face->sizes_list, size );
if ( node )
{
@@ -1621,13 +1694,22 @@
FT_Driver driver;
FT_Memory memory;
FT_DriverInterface* interface;
- FT_Size_Metrics* metrics = &face->size->metrics;
+ FT_Size_Metrics* metrics;
FT_Long dim_x, dim_y;
- if ( !face || !face->size || !face->driver )
+ if ( !face )
return FT_Err_Invalid_Face_Handle;
+ if ( !face->size )
+ return FT_Err_Invalid_Size_Handle;
+
+ driver = face->driver;
+ if ( !driver )
+ return FT_Err_Invalid_Driver_Handle;
+
+ metrics = &face->size->metrics;
+
if ( !char_width )
char_width = char_height;
else if ( !char_height )
@@ -1705,10 +1787,16 @@
FT_Size_Metrics* metrics = &face->size->metrics;
- if ( !face || !face->size || !face->driver )
+ if ( !face )
return FT_Err_Invalid_Face_Handle;
- driver = face->driver;
+ if ( !face->size )
+ return FT_Err_Invalid_Size_Handle;
+
+ driver = face->driver;
+ if ( !driver )
+ return FT_Err_Invalid_Driver_Handle;
+
interface = &driver->interface;
memory = driver->memory;
@@ -1770,12 +1858,18 @@
FT_GlyphSlot slot;
+ if ( !face )
+ return FT_Err_Invalid_Face_Handle;
+
+ if ( !aslot )
+ return FT_Err_Invalid_Argument;
+
*aslot = 0;
- if ( !face || !face->driver )
- return FT_Err_Invalid_Face_Handle;
+ driver = face->driver;
+ if ( !driver )
+ return FT_Err_Invalid_Driver_Handle;
- driver = face->driver;
interface = &driver->interface;
memory = driver->memory;
@@ -1880,9 +1974,15 @@
FT_Driver driver;
- if ( !face || !face->size || !face->glyph )
+ if ( !face )
return FT_Err_Invalid_Face_Handle;
+ if ( !face->size )
+ return FT_Err_Invalid_Size_Handle;
+
+ if ( !face->glyph )
+ return FT_Err_Invalid_Slot_Handle;
+
if ( glyph_index >= face->num_glyphs )
return FT_Err_Invalid_Argument;
@@ -1935,9 +2035,18 @@
FT_UInt glyph_index;
- if ( !face || !face->size || !face->glyph || !face->charmap )
+ if ( !face )
return FT_Err_Invalid_Face_Handle;
+ if ( !face->size )
+ return FT_Err_Invalid_Size_Handle;
+
+ if ( !face->glyph )
+ return FT_Err_Invalid_Slot_Handle;
+
+ if ( !face->charmap )
+ return FT_Err_Invalid_CharMap_Handle;
+
driver = face->driver;
glyph_index = FT_Get_Char_Index( face, char_code );
@@ -1986,17 +2095,17 @@
FT_UInt right_glyph,
FT_Vector* kerning )
{
- FT_Error error;
+ FT_Error error = FT_Err_Ok;
FT_Driver driver;
FT_Memory memory;
if ( !face )
- {
- error = FT_Err_Invalid_Face_Handle;
- goto Exit;
- }
+ return FT_Err_Invalid_Face_Handle;
+ if ( !kerning )
+ return FT_Err_Invalid_Argument;
+
driver = face->driver;
memory = driver->memory;
@@ -2011,10 +2120,8 @@
{
kerning->x = 0;
kerning->y = 0;
- error = FT_Err_Ok;
}
- Exit:
return error;
}
@@ -2043,10 +2150,19 @@
FT_EXPORT_FUNC( FT_Error ) FT_Select_Charmap( FT_Face face,
FT_Encoding encoding )
{
- FT_CharMap* cur = face->charmaps;
- FT_CharMap* limit = cur + face->num_charmaps;
+ FT_CharMap* cur;
+ FT_CharMap* limit;
+ if ( !face )
+ return FT_Err_Invalid_Face_Handle;
+
+ cur = face->charmaps;
+ if ( !cur )
+ return FT_Err_Invalid_CharMap_Handle;
+
+ limit = cur + face->num_charmaps;
+
for ( ; cur < limit; cur++ )
{
if ( cur[0]->encoding == encoding )
@@ -2083,10 +2199,19 @@
FT_EXPORT_FUNC( FT_Error ) FT_Set_Charmap( FT_Face face,
FT_CharMap charmap )
{
- FT_CharMap* cur = face->charmaps;
- FT_CharMap* limit = cur + face->num_charmaps;
+ FT_CharMap* cur;
+ FT_CharMap* limit;
+ if ( !face )
+ return FT_Err_Invalid_Face_Handle;
+
+ cur = face->charmaps;
+ if ( !cur )
+ return FT_Err_Invalid_CharMap_Handle;
+
+ limit = cur + face->num_charmaps;
+
for ( ; cur < limit; cur++ )
{
if ( cur[0] == charmap )
@@ -2115,8 +2240,8 @@
/* <Return> */
/* The glyph index. 0 means `undefined character code'. */
/* */
- FT_EXPORT_FUNC( FT_UInt ) FT_Get_Char_Index( FT_Face face,
- FT_ULong charcode )
+ FT_EXPORT_FUNC( FT_UInt ) FT_Get_Char_Index( FT_Face face,
+ FT_ULong charcode )
{
FT_UInt result;
FT_Driver driver;
@@ -2197,6 +2322,8 @@
/* */
FT_EXPORT_FUNC( FT_Error ) FT_Done_FreeType( FT_Library library )
{
+ /* test for valid `library' delayed to FT_Done_Library() */
+
/* Discard the library object */
FT_Done_Library( library );
--- a/src/base/ftoutln.c
+++ b/src/base/ftoutln.c
@@ -77,10 +77,15 @@
FT_UInt first; /* index of first point in contour */
char tag; /* current point's state */
- FT_Int shift = interface->shift;
- FT_Pos delta = interface->delta;
+ FT_Int shift;
+ FT_Pos delta;
+ if ( !outline || !interface )
+ return FT_Err_Invalid_Argument;
+
+ shift = interface->shift;
+ delta = interface->delta;
first = 0;
for ( n = 0; n < outline->n_contours; n++ )
@@ -718,6 +723,12 @@
FT_Raster_Params params;
+ if ( !library )
+ return FT_Err_Invalid_Library_Handle;
+
+ if ( !outline || !bitmap )
+ return FT_Err_Invalid_Argument;
+
error = FT_Err_Invalid_Glyph_Format;
raster = FT_Get_Raster( library, ft_glyph_format_outline, &funcs );
if ( !raster )
@@ -770,9 +781,9 @@
/* converter is called, which means that the value you give to it is */
/* actually ignored. */
/* */
- FT_EXPORT_FUNC( FT_Error ) FT_Outline_Render( FT_Library library,
- FT_Outline* outline,
- FT_Raster_Params* params )
+ FT_EXPORT_FUNC( FT_Error ) FT_Outline_Render( FT_Library library,
+ FT_Outline* outline,
+ FT_Raster_Params* params )
{
FT_Error error;
FT_Raster raster;
@@ -779,6 +790,12 @@
FT_Raster_Funcs funcs;
+ if ( !library )
+ return FT_Err_Invalid_Library_Handle;
+
+ if ( !outline || !params )
+ return FT_Err_Invalid_Argument;
+
error = FT_Err_Invalid_Glyph_Format;
raster = FT_Get_Raster( library, ft_glyph_format_outline, &funcs );
if ( !raster )
@@ -925,11 +942,17 @@
/* <MT-Note> */
/* Yes. */
/* */
+ /* <Note> */
+ /* The result is undefined if either `vector' or `matrix' is invalid. */
+ /* */
FT_EXPORT_FUNC( void ) FT_Vector_Transform( FT_Vector* vector,
FT_Matrix* matrix )
{
FT_Pos xz, yz;
+
+ if ( !vector || !matrix )
+ return;
xz = FT_MulFix( vector->x, matrix->xx ) +
FT_MulFix( vector->y, matrix->xy );
--- a/src/base/ftraster.c
+++ b/src/base/ftraster.c
@@ -2059,12 +2059,12 @@
}
- static void
- Vertical_Sweep_Drop( RAS_ARGS Short y,
- FT_F26Dot6 x1,
- FT_F26Dot6 x2,
- PProfile left,
- PProfile right )
+ static
+ void Vertical_Sweep_Drop( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
{
Long e1, e2;
Short c1, f1;
--- a/src/cff/t2load.c
+++ b/src/cff/t2load.c
@@ -112,14 +112,17 @@
static
void t2_done_cff_index( CFF_Index* index )
{
- FT_Stream stream = index->stream;
- FT_Memory memory = stream->memory;
+ if ( index->stream )
+ {
+ FT_Stream stream = index->stream;
+ FT_Memory memory = stream->memory;
- if (index->bytes)
- RELEASE_Frame( index->bytes );
+ if (index->bytes)
+ RELEASE_Frame( index->bytes );
- FREE( index->offsets );
- MEM_Set( index, 0, sizeof(*index) );
+ FREE( index->offsets );
+ MEM_Set( index, 0, sizeof(*index) );
+ }
}