diff options
Diffstat (limited to 'src/type1/t1load.c')
-rw-r--r-- | src/type1/t1load.c | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/src/type1/t1load.c b/src/type1/t1load.c index 817c940c1..69116f0c6 100644 --- a/src/type1/t1load.c +++ b/src/type1/t1load.c @@ -971,7 +971,7 @@ return; /* we use a T1_Table to store our charnames */ - encode->num_chars = count; + loader->num_chars = encode->num_chars = count; if ( ALLOC_ARRAY( encode->char_index, count, FT_Short ) || ALLOC_ARRAY( encode->char_name, count, FT_String* ) || ( error = psaux->ps_table_funcs->init( @@ -1164,12 +1164,21 @@ /* */ if ( face->type1.private_dict.lenIV >= 0 ) { - psaux->t1_decrypt( base, size, 4330 ); + FT_Byte* temp; + + + /* t1_decrypt() shouldn't write to base -- make temporary copy */ + if ( ALLOC( temp, size ) ) + goto Fail; + MEM_Copy( temp, base, size ); + psaux->t1_decrypt( temp, size, 4330 ); size -= face->type1.private_dict.lenIV; - base += face->type1.private_dict.lenIV; + error = T1_Add_Table( table, index, + temp + face->type1.private_dict.lenIV, size ); + FREE( temp ); } - - error = T1_Add_Table( table, index, base, size ); + else + error = T1_Add_Table( table, index, base, size ); if ( error ) goto Fail; } @@ -1296,12 +1305,21 @@ if ( face->type1.private_dict.lenIV >= 0 ) { - psaux->t1_decrypt( base, size, 4330 ); + FT_Byte* temp; + + + /* t1_decrypt() shouldn't write to base -- make temporary copy */ + if ( ALLOC( temp, size ) ) + goto Fail; + MEM_Copy( temp, base, size ); + psaux->t1_decrypt( temp, size, 4330 ); size -= face->type1.private_dict.lenIV; - base += face->type1.private_dict.lenIV; + error = T1_Add_Table( code_table, n, + temp + face->type1.private_dict.lenIV, size ); + FREE( temp ); } - - error = T1_Add_Table( code_table, n, base, size ); + else + error = T1_Add_Table( code_table, n, base, size ); if ( error ) goto Fail; @@ -1425,10 +1443,8 @@ /* we added a glyph. */ loader->num_glyphs = n + 1; - } - return; Fail: @@ -1734,7 +1750,7 @@ type1->encoding.code_first = min_char; type1->encoding.code_last = max_char; type1->encoding.num_chars = loader.num_chars; - } + } Exit: t1_done_loader( &loader ); |