Index: third_party/freetype/src/cid/cidload.c |
diff --git a/third_party/freetype/src/cid/cidload.c b/third_party/freetype/src/cid/cidload.c |
index 1cda0eee7ada422ada94e842586420c084fcf3e8..e23b82f6738ebf65370ed3aa967e1bc36f612703 100644 |
--- a/third_party/freetype/src/cid/cidload.c |
+++ b/third_party/freetype/src/cid/cidload.c |
@@ -4,7 +4,7 @@ |
/* */ |
/* CID-keyed Type1 font loader (body). */ |
/* */ |
-/* Copyright 1996-2006, 2009, 2011-2014 by */ |
+/* Copyright 1996-2015 by */ |
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
/* */ |
/* This file is part of the FreeType project, and may only be used, */ |
@@ -38,7 +38,7 @@ |
/* read a single offset */ |
- FT_LOCAL_DEF( FT_Long ) |
+ FT_LOCAL_DEF( FT_ULong ) |
cid_get_offset( FT_Byte* *start, |
FT_Byte offsize ) |
{ |
@@ -53,7 +53,7 @@ |
} |
*start = p; |
- return (FT_Long)result; |
+ return result; |
} |
@@ -167,6 +167,7 @@ |
matrix = &dict->font_matrix; |
offset = &dict->font_offset; |
+ /* input is scaled by 1000 to accommodate default FontMatrix */ |
result = cid_parser_to_fixed_array( parser, 6, temp, 3 ); |
if ( result < 6 ) |
@@ -180,15 +181,12 @@ |
return FT_THROW( Invalid_File_Format ); |
} |
- /* Set Units per EM based on FontMatrix values. We set the value to */ |
- /* 1000 / temp_scale, because temp_scale was already multiplied by */ |
- /* 1000 (in t1_tofixed, from psobjs.c). */ |
- |
- root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale ); |
- |
- /* we need to scale the values by 1.0/temp[3] */ |
+ /* atypical case */ |
if ( temp_scale != 0x10000L ) |
{ |
+ /* set units per EM based on FontMatrix values */ |
+ root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale ); |
+ |
temp[0] = FT_DivFix( temp[0], temp_scale ); |
temp[1] = FT_DivFix( temp[1], temp_scale ); |
temp[2] = FT_DivFix( temp[2], temp_scale ); |
@@ -222,6 +220,12 @@ |
num_dicts = cid_parser_to_int( parser ); |
+ if ( num_dicts < 0 ) |
+ { |
+ FT_ERROR(( "parse_fd_array: invalid number of dictionaries\n" )); |
+ error = FT_THROW( Invalid_File_Format ); |
+ goto Exit; |
+ } |
if ( !cid->font_dicts ) |
{ |
@@ -231,7 +235,7 @@ |
if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) ) |
goto Exit; |
- cid->num_dicts = (FT_UInt)num_dicts; |
+ cid->num_dicts = num_dicts; |
/* don't forget to set a few defaults */ |
for ( n = 0; n < cid->num_dicts; n++ ) |
@@ -290,7 +294,7 @@ |
cid_parse_dict( CID_Face face, |
CID_Loader* loader, |
FT_Byte* base, |
- FT_Long size ) |
+ FT_ULong size ) |
{ |
CID_Parser* parser = &loader->parser; |
@@ -342,11 +346,11 @@ |
/* look for immediates */ |
if ( *cur == '/' && cur + 2 < limit ) |
{ |
- FT_PtrDist len; |
+ FT_UInt len; |
cur++; |
- len = parser->root.cursor - cur; |
+ len = (FT_UInt)( parser->root.cursor - cur ); |
if ( len > 0 && len < 22 ) |
{ |
@@ -363,10 +367,10 @@ |
if ( !name ) |
break; |
- if ( cur[0] == name[0] && |
- len == (FT_PtrDist)ft_strlen( (const char*)name ) ) |
+ if ( cur[0] == name[0] && |
+ len == ft_strlen( (const char*)name ) ) |
{ |
- FT_PtrDist n; |
+ FT_UInt n; |
for ( n = 1; n < len; n++ ) |
@@ -407,7 +411,7 @@ |
FT_Int n; |
CID_Subrs subr; |
FT_UInt max_offsets = 0; |
- FT_ULong* offsets = 0; |
+ FT_ULong* offsets = NULL; |
PSAux_Service psaux = (PSAux_Service)face->psaux; |
@@ -450,8 +454,8 @@ |
} |
/* read the subrmap's offsets */ |
- if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) || |
- FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) ) |
+ if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) || |
+ FT_FRAME_ENTER( ( num_subrs + 1 ) * (FT_UInt)dict->sd_bytes ) ) |
goto Fail; |
p = (FT_Byte*)stream->cursor; |
@@ -500,7 +504,7 @@ |
} |
} |
- subr->num_subrs = num_subrs; |
+ subr->num_subrs = (FT_Int)num_subrs; |
} |
Exit: |
@@ -546,7 +550,7 @@ |
static FT_Error |
cid_hex_to_binary( FT_Byte* data, |
- FT_Long data_len, |
+ FT_ULong data_len, |
FT_ULong offset, |
CID_Face face ) |
{ |