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; |
} |