| Index: third_party/freetype/src/base/ftrfork.c
|
| diff --git a/third_party/freetype/src/base/ftrfork.c b/third_party/freetype/src/base/ftrfork.c
|
| index 5352970389adfe74eff304338dc919057e064895..c30c76678e64fe7b89accb0070266bebb4d4a988 100644
|
| --- a/third_party/freetype/src/base/ftrfork.c
|
| +++ b/third_party/freetype/src/base/ftrfork.c
|
| @@ -4,7 +4,7 @@
|
| /* */
|
| /* Embedded resource forks accessor (body). */
|
| /* */
|
| -/* Copyright 2004-2010, 2013, 2014 by */
|
| +/* Copyright 2004-2015 by */
|
| /* Masatake YAMATO and Redhat K.K. */
|
| /* */
|
| /* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */
|
| @@ -63,7 +63,7 @@
|
| FT_UNUSED( library );
|
|
|
|
|
| - error = FT_Stream_Seek( stream, rfork_offset );
|
| + error = FT_Stream_Seek( stream, (FT_ULong)rfork_offset );
|
| if ( error )
|
| return error;
|
|
|
| @@ -71,25 +71,36 @@
|
| if ( error )
|
| return error;
|
|
|
| - *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |
|
| - ( head[1] << 16 ) |
|
| - ( head[2] << 8 ) |
|
| - head[3] );
|
| - map_pos = rfork_offset + ( ( head[4] << 24 ) |
|
| - ( head[5] << 16 ) |
|
| - ( head[6] << 8 ) |
|
| - head[7] );
|
| - rdata_len = ( head[ 8] << 24 ) |
|
| - ( head[ 9] << 16 ) |
|
| - ( head[10] << 8 ) |
|
| - head[11];
|
| + /* ensure positive values */
|
| + if ( head[0] >= 0x80 || head[4] >= 0x80 || head[8] >= 0x80 )
|
| + return FT_THROW( Unknown_File_Format );
|
| +
|
| + *rdata_pos = ( head[ 0] << 24 ) |
|
| + ( head[ 1] << 16 ) |
|
| + ( head[ 2] << 8 ) |
|
| + head[ 3];
|
| + map_pos = ( head[ 4] << 24 ) |
|
| + ( head[ 5] << 16 ) |
|
| + ( head[ 6] << 8 ) |
|
| + head[ 7];
|
| + rdata_len = ( head[ 8] << 24 ) |
|
| + ( head[ 9] << 16 ) |
|
| + ( head[10] << 8 ) |
|
| + head[11];
|
|
|
| /* map_len = head[12] .. head[15] */
|
|
|
| - if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )
|
| + if ( *rdata_pos != map_pos - rdata_len || map_pos == 0 )
|
| return FT_THROW( Unknown_File_Format );
|
|
|
| - error = FT_Stream_Seek( stream, map_pos );
|
| + if ( FT_LONG_MAX - rfork_offset < *rdata_pos ||
|
| + FT_LONG_MAX - rfork_offset < map_pos )
|
| + return FT_THROW( Unknown_File_Format );
|
| +
|
| + *rdata_pos += rfork_offset;
|
| + map_pos += rfork_offset;
|
| +
|
| + error = FT_Stream_Seek( stream, (FT_ULong)map_pos );
|
| if ( error )
|
| return error;
|
|
|
| @@ -124,7 +135,7 @@
|
| if ( type_list == -1 )
|
| return FT_THROW( Unknown_File_Format );
|
|
|
| - error = FT_Stream_Seek( stream, map_pos + type_list );
|
| + error = FT_Stream_Seek( stream, (FT_ULong)( map_pos + type_list ) );
|
| if ( error )
|
| return error;
|
|
|
| @@ -166,7 +177,7 @@
|
|
|
|
|
| FT_TRACE3(( "\n" ));
|
| - error = FT_Stream_Seek( stream, map_offset );
|
| + error = FT_Stream_Seek( stream, (FT_ULong)map_offset );
|
| if ( error )
|
| return error;
|
|
|
| @@ -182,10 +193,10 @@
|
| return error;
|
|
|
| FT_TRACE2(( "Resource tags: %c%c%c%c\n",
|
| - (char)( 0xff & ( tag_internal >> 24 ) ),
|
| - (char)( 0xff & ( tag_internal >> 16 ) ),
|
| - (char)( 0xff & ( tag_internal >> 8 ) ),
|
| - (char)( 0xff & ( tag_internal >> 0 ) ) ));
|
| + (char)( 0xFF & ( tag_internal >> 24 ) ),
|
| + (char)( 0xFF & ( tag_internal >> 16 ) ),
|
| + (char)( 0xFF & ( tag_internal >> 8 ) ),
|
| + (char)( 0xFF & ( tag_internal >> 0 ) ) ));
|
| FT_TRACE3(( " : subcount=%d, suboffset=0x%04x\n",
|
| subcnt, rpos ));
|
|
|
| @@ -194,7 +205,7 @@
|
| *count = subcnt + 1;
|
| rpos += map_offset;
|
|
|
| - error = FT_Stream_Seek( stream, rpos );
|
| + error = FT_Stream_Seek( stream, (FT_ULong)rpos );
|
| if ( error )
|
| return error;
|
|
|
| @@ -220,7 +231,7 @@
|
|
|
| if (sort_by_res_id)
|
| {
|
| - ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ),
|
| + ft_qsort( ref, (size_t)*count, sizeof ( FT_RFork_Ref ),
|
| ( int(*)(const void*, const void*) )
|
| ft_raccess_sort_ref_by_id );
|
|
|
| @@ -713,9 +724,9 @@
|
| FT_UShort n_of_entries;
|
|
|
| int i;
|
| - FT_UInt32 entry_id, entry_offset, entry_length = 0;
|
| + FT_Int32 entry_id, entry_offset, entry_length = 0;
|
|
|
| - const FT_UInt32 resource_fork_entry_id = 0x2;
|
| + const FT_Int32 resource_fork_entry_id = 0x2;
|
|
|
| FT_UNUSED( library );
|
| FT_UNUSED( base_file_name );
|
| @@ -813,7 +824,9 @@
|
| tmp = ft_strrchr( original_name, '/' );
|
| if ( tmp )
|
| {
|
| - ft_strncpy( new_name, original_name, tmp - original_name + 1 );
|
| + ft_strncpy( new_name,
|
| + original_name,
|
| + (size_t)( tmp - original_name + 1 ) );
|
| new_name[tmp - original_name + 1] = '\0';
|
| slash = tmp + 1;
|
| }
|
|
|