Signedness revisions.

This eliminates explicit casting by switching to unsigned fields.
The revisions mostly impact the handling of CID fonts.

* include/freetype/fttypes.h (FT_Data): Change to unsigned `length`.
* include/freetype/t1tables.h (CID_FaceDictRec): Ditto for `sd_bytes`.
(CID_FaceInfoRec): Ditto for `gd_bytes` and `gd_bytes`.
* include/freetype/internal/tttypes.h (TT_LoaderRec): Ditto for
`byte_len`.

* src/cid/cidgload.c (cid_load_glyph): Updated.
* src/cid/cidload.h (cid_get_offset): Update argument.
* src/cid/cidload.c (cid_get_offset, cid_read_subrs, cid_face_open):
Updated.
* src/cff/cffgload.c (cff_get_glyph_data, cff_free_glyph_data):
Updated.
* src/psaux/psft.c (cf2_getT1SeacComponent): Updated.
* src/truetype/ttgload.c (TT_Process_Composite_Glyph,
load_truetype_glyph): Updated.
This commit is contained in:
Alexei Podtelezhnikov 2021-10-07 22:41:56 -04:00
parent 842ec5ed62
commit 22befeef82
10 changed files with 48 additions and 38 deletions

View File

@ -1,3 +1,15 @@
CHANGES BETWEEN 2.11.0 and 2.11.1
I. IMPORTANT CHANGES
- Some fields in the `CID_FaceDictRec`, `CID_FaceInfoRec`, and
`FT_Data` structures have been changed from signed to unsigned
type, which better reflects the actual usage. It is also an
additional means to protect against malformed input.
======================================================================
CHANGES BETWEEN 2.10.4 and 2.11.0 CHANGES BETWEEN 2.10.4 and 2.11.0
I. IMPORTANT CHANGES I. IMPORTANT CHANGES

View File

@ -413,7 +413,7 @@ FT_BEGIN_HEADER
typedef struct FT_Data_ typedef struct FT_Data_
{ {
const FT_Byte* pointer; const FT_Byte* pointer;
FT_Int length; FT_UInt length;
} FT_Data; } FT_Data;

View File

@ -1734,7 +1734,7 @@ FT_BEGIN_HEADER
FT_UInt glyph_index; FT_UInt glyph_index;
FT_Stream stream; FT_Stream stream;
FT_Int byte_len; FT_UInt byte_len;
FT_Short n_contours; FT_Short n_contours;
FT_BBox bbox; FT_BBox bbox;

View File

@ -360,7 +360,7 @@ FT_BEGIN_HEADER
FT_UInt num_subrs; FT_UInt num_subrs;
FT_ULong subrmap_offset; FT_ULong subrmap_offset;
FT_Int sd_bytes; FT_UInt sd_bytes;
} CID_FaceDictRec; } CID_FaceDictRec;
@ -415,8 +415,8 @@ FT_BEGIN_HEADER
FT_ULong xuid[16]; FT_ULong xuid[16];
FT_ULong cidmap_offset; FT_ULong cidmap_offset;
FT_Int fd_bytes; FT_UInt fd_bytes;
FT_Int gd_bytes; FT_UInt gd_bytes;
FT_ULong cid_count; FT_ULong cid_count;
FT_Int num_dicts; FT_Int num_dicts;

View File

@ -59,7 +59,7 @@
*pointer = (FT_Byte*)data.pointer; *pointer = (FT_Byte*)data.pointer;
*length = (FT_ULong)data.length; *length = data.length;
return error; return error;
} }
@ -94,7 +94,7 @@
data.pointer = *pointer; data.pointer = *pointer;
data.length = (FT_Int)length; data.length = (FT_UInt)length;
face->root.internal->incremental_interface->funcs->free_glyph_data( face->root.internal->incremental_interface->funcs->free_glyph_data(
face->root.internal->incremental_interface->object, &data ); face->root.internal->incremental_interface->object, &data );

View File

@ -63,7 +63,7 @@
#endif #endif
FT_TRACE1(( "cid_load_glyph: glyph index %d\n", glyph_index )); FT_TRACE1(( "cid_load_glyph: glyph index %u\n", glyph_index ));
#ifdef FT_CONFIG_OPTION_INCREMENTAL #ifdef FT_CONFIG_OPTION_INCREMENTAL
@ -80,11 +80,11 @@
goto Exit; goto Exit;
p = (FT_Byte*)glyph_data.pointer; p = (FT_Byte*)glyph_data.pointer;
fd_select = cid_get_offset( &p, (FT_Byte)cid->fd_bytes ); fd_select = cid_get_offset( &p, cid->fd_bytes );
if ( glyph_data.length != 0 ) if ( glyph_data.length != 0 )
{ {
glyph_length = (FT_ULong)( glyph_data.length - cid->fd_bytes ); glyph_length = glyph_data.length - cid->fd_bytes;
if ( !FT_QALLOC( charstring, glyph_length ) ) if ( !FT_QALLOC( charstring, glyph_length ) )
FT_MEM_COPY( charstring, glyph_data.pointer + cid->fd_bytes, FT_MEM_COPY( charstring, glyph_data.pointer + cid->fd_bytes,
@ -104,7 +104,7 @@
/* For ordinary fonts read the CID font dictionary index */ /* For ordinary fonts read the CID font dictionary index */
/* and charstring offset from the CIDMap. */ /* and charstring offset from the CIDMap. */
{ {
FT_UInt entry_len = (FT_UInt)( cid->fd_bytes + cid->gd_bytes ); FT_UInt entry_len = cid->fd_bytes + cid->gd_bytes;
FT_ULong off1, off2; FT_ULong off1, off2;
@ -114,10 +114,10 @@
goto Exit; goto Exit;
p = (FT_Byte*)stream->cursor; p = (FT_Byte*)stream->cursor;
fd_select = cid_get_offset( &p, (FT_Byte)cid->fd_bytes ); fd_select = cid_get_offset( &p, cid->fd_bytes );
off1 = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ); off1 = cid_get_offset( &p, cid->gd_bytes );
p += cid->fd_bytes; p += cid->fd_bytes;
off2 = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ); off2 = cid_get_offset( &p, cid->gd_bytes );
FT_FRAME_EXIT(); FT_FRAME_EXIT();
if ( fd_select >= (FT_ULong)cid->num_dicts || if ( fd_select >= (FT_ULong)cid->num_dicts ||

View File

@ -41,7 +41,7 @@
/* read a single offset */ /* read a single offset */
FT_LOCAL_DEF( FT_ULong ) FT_LOCAL_DEF( FT_ULong )
cid_get_offset( FT_Byte* *start, cid_get_offset( FT_Byte* *start,
FT_Byte offsize ) FT_UInt offsize )
{ {
FT_ULong result; FT_ULong result;
FT_Byte* p = *start; FT_Byte* p = *start;
@ -275,7 +275,7 @@
if ( (FT_ULong)num_dicts > stream->size / 100 ) if ( (FT_ULong)num_dicts > stream->size / 100 )
{ {
FT_TRACE0(( "parse_fd_array: adjusting FDArray size" FT_TRACE0(( "parse_fd_array: adjusting FDArray size"
" (from %ld to %ld)\n", " (from %ld to %lu)\n",
num_dicts, num_dicts,
stream->size / 100 )); stream->size / 100 ));
num_dicts = (FT_Long)( stream->size / 100 ); num_dicts = (FT_Long)( stream->size / 100 );
@ -560,12 +560,12 @@
/* read the subrmap's offsets */ /* read the subrmap's offsets */
if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) || if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) ||
FT_FRAME_ENTER( ( num_subrs + 1 ) * (FT_UInt)dict->sd_bytes ) ) FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) )
goto Fail; goto Fail;
p = (FT_Byte*)stream->cursor; p = (FT_Byte*)stream->cursor;
for ( count = 0; count <= num_subrs; count++ ) for ( count = 0; count <= num_subrs; count++ )
offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes ); offsets[count] = cid_get_offset( &p, dict->sd_bytes );
FT_FRAME_EXIT(); FT_FRAME_EXIT();
@ -805,7 +805,7 @@
face->root.stream->size - parser->data_offset ) face->root.stream->size - parser->data_offset )
{ {
FT_TRACE0(( "cid_face_open: adjusting length of binary data\n" )); FT_TRACE0(( "cid_face_open: adjusting length of binary data\n" ));
FT_TRACE0(( " (from %ld to %ld bytes)\n", FT_TRACE0(( " (from %lu to %lu bytes)\n",
parser->binary_length, parser->binary_length,
face->root.stream->size - parser->data_offset )); face->root.stream->size - parser->data_offset ));
parser->binary_length = face->root.stream->size - parser->binary_length = face->root.stream->size -
@ -833,10 +833,10 @@
/* sanity tests */ /* sanity tests */
if ( cid->fd_bytes < 0 || cid->gd_bytes < 1 ) if ( cid->gd_bytes == 0 )
{ {
FT_ERROR(( "cid_face_open:" FT_ERROR(( "cid_face_open:"
" Invalid `FDBytes' or `GDBytes' value\n" )); " Invalid `GDBytes' value\n" ));
error = FT_THROW( Invalid_File_Format ); error = FT_THROW( Invalid_File_Format );
goto Exit; goto Exit;
} }
@ -853,7 +853,7 @@
} }
binary_length = face->cid_stream->size - cid->data_offset; binary_length = face->cid_stream->size - cid->data_offset;
entry_len = (FT_ULong)( cid->fd_bytes + cid->gd_bytes ); entry_len = cid->fd_bytes + cid->gd_bytes;
for ( n = 0; n < cid->num_dicts; n++ ) for ( n = 0; n < cid->num_dicts; n++ )
{ {
@ -879,8 +879,7 @@
dict->private_dict.blue_fuzz = 1; dict->private_dict.blue_fuzz = 1;
} }
if ( dict->sd_bytes < 0 || if ( dict->num_subrs && dict->sd_bytes == 0 )
( dict->num_subrs && dict->sd_bytes < 1 ) )
{ {
FT_ERROR(( "cid_face_open: Invalid `SDBytes' value\n" )); FT_ERROR(( "cid_face_open: Invalid `SDBytes' value\n" ));
error = FT_THROW( Invalid_File_Format ); error = FT_THROW( Invalid_File_Format );
@ -907,7 +906,7 @@
if ( (FT_Int)dict->num_subrs < 0 || if ( (FT_Int)dict->num_subrs < 0 ||
( dict->sd_bytes && ( dict->sd_bytes &&
dict->num_subrs > ( binary_length - dict->subrmap_offset ) / dict->num_subrs > ( binary_length - dict->subrmap_offset ) /
(FT_UInt)dict->sd_bytes ) ) dict->sd_bytes ) )
{ {
FT_ERROR(( "cid_face_open: Invalid `SubrCount' value\n" )); FT_ERROR(( "cid_face_open: Invalid `SubrCount' value\n" ));
error = FT_THROW( Invalid_File_Format ); error = FT_THROW( Invalid_File_Format );

View File

@ -37,7 +37,7 @@ FT_BEGIN_HEADER
FT_LOCAL( FT_ULong ) FT_LOCAL( FT_ULong )
cid_get_offset( FT_Byte** start, cid_get_offset( FT_Byte** start,
FT_Byte offsize ); FT_UInt offsize );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
cid_face_open( CID_Face face, cid_face_open( CID_Face face,

View File

@ -742,13 +742,13 @@
/* For ordinary fonts get the character data stored in the face record. */ /* For ordinary fonts get the character data stored in the face record. */
{ {
glyph_data.pointer = type1->charstrings[glyph_index]; glyph_data.pointer = type1->charstrings[glyph_index];
glyph_data.length = (FT_Int)type1->charstrings_len[glyph_index]; glyph_data.length = type1->charstrings_len[glyph_index];
} }
if ( !error ) if ( !error )
{ {
FT_Byte* charstring_base = (FT_Byte*)glyph_data.pointer; FT_Byte* charstring_base = (FT_Byte*)glyph_data.pointer;
FT_ULong charstring_len = (FT_ULong)glyph_data.length; FT_ULong charstring_len = glyph_data.length;
FT_ASSERT( charstring_base + charstring_len >= charstring_base ); FT_ASSERT( charstring_base + charstring_len >= charstring_base );
@ -778,7 +778,7 @@
face = (T1_Face)decoder->builder.face; face = (T1_Face)decoder->builder.face;
data.pointer = buf->start; data.pointer = buf->start;
data.length = (FT_Int)( buf->end - buf->start ); data.length = (FT_UInt)( buf->end - buf->start );
if ( face->root.internal->incremental_interface ) if ( face->root.internal->incremental_interface )
face->root.internal->incremental_interface->funcs->free_glyph_data( face->root.internal->incremental_interface->funcs->free_glyph_data(

View File

@ -1392,7 +1392,7 @@
FT_READ_USHORT( n_ins ) ) FT_READ_USHORT( n_ins ) )
return error; return error;
FT_TRACE5(( " Instructions size = %d\n", n_ins )); FT_TRACE5(( " Instructions size = %hu\n", n_ins ));
/* check it */ /* check it */
max_ins = loader->face->max_profile.maxSizeOfInstructions; max_ins = loader->face->max_profile.maxSizeOfInstructions;
@ -1400,10 +1400,10 @@
{ {
/* don't trust `maxSizeOfInstructions'; */ /* don't trust `maxSizeOfInstructions'; */
/* only do a rough safety check */ /* only do a rough safety check */
if ( (FT_Int)n_ins > loader->byte_len ) if ( n_ins > loader->byte_len )
{ {
FT_TRACE1(( "TT_Process_Composite_Glyph:" FT_TRACE1(( "TT_Process_Composite_Glyph:"
" too many instructions (%d) for glyph with length %d\n", " too many instructions (%hu) for glyph with length %u\n",
n_ins, loader->byte_len )); n_ins, loader->byte_len ));
return FT_THROW( Too_Many_Hints ); return FT_THROW( Too_Many_Hints );
} }
@ -1686,7 +1686,7 @@
FT_ZERO( &inc_stream ); FT_ZERO( &inc_stream );
FT_Stream_OpenMemory( &inc_stream, FT_Stream_OpenMemory( &inc_stream,
glyph_data.pointer, glyph_data.pointer,
(FT_ULong)glyph_data.length ); glyph_data.length );
loader->stream = &inc_stream; loader->stream = &inc_stream;
} }
@ -1694,8 +1694,7 @@
#endif /* FT_CONFIG_OPTION_INCREMENTAL */ #endif /* FT_CONFIG_OPTION_INCREMENTAL */
offset = tt_face_get_location( face, glyph_index, offset = tt_face_get_location( face, glyph_index, &loader->byte_len );
(FT_UInt*)&loader->byte_len );
if ( loader->byte_len > 0 ) if ( loader->byte_len > 0 )
{ {
@ -1714,7 +1713,7 @@
error = face->access_glyph_frame( loader, glyph_index, error = face->access_glyph_frame( loader, glyph_index,
face->glyf_offset + offset, face->glyf_offset + offset,
(FT_UInt)loader->byte_len ); loader->byte_len );
if ( error ) if ( error )
goto Exit; goto Exit;
@ -1849,7 +1848,7 @@
/* (which consists of 10 bytes) */ /* (which consists of 10 bytes) */
error = face->access_glyph_frame( loader, glyph_index, error = face->access_glyph_frame( loader, glyph_index,
face->glyf_offset + offset + 10, face->glyf_offset + offset + 10,
(FT_UInt)loader->byte_len - 10 ); loader->byte_len - 10 );
if ( error ) if ( error )
goto Exit; goto Exit;
@ -2105,7 +2104,7 @@
FT_UInt num_base_subgs = gloader->base.num_subglyphs; FT_UInt num_base_subgs = gloader->base.num_subglyphs;
FT_Stream old_stream = loader->stream; FT_Stream old_stream = loader->stream;
FT_Int old_byte_len = loader->byte_len; FT_UInt old_byte_len = loader->byte_len;
FT_GlyphLoader_Add( gloader ); FT_GlyphLoader_Add( gloader );