In cid_read_subrs, decode subroutines only if lenIV >= 0.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
diff --git a/src/cid/cidload.c b/src/cid/cidload.c
index a372a99..18c6d53 100644
--- a/src/cid/cidload.c
+++ b/src/cid/cidload.c
@@ -413,7 +413,8 @@
subr = face->subrs;
for ( n = 0; n < cid->num_dicts; n++, subr++ )
{
- CID_FontDict* dict = cid->font_dicts + n;
+ CID_FontDict* dict = cid->font_dicts + n;
+ FT_Int lenIV = dict->private_dict.lenIV;
FT_UInt count, num_subrs = dict->num_subrs;
FT_ULong data_len;
FT_Byte* p;
@@ -464,14 +465,17 @@
subr->code[count] = subr->code[count - 1] + len;
}
- /* decrypt subroutines */
- for ( count = 0; count < num_subrs; count++ )
+ /* decrypt subroutines, but only if lenIV >= 0. */
+ if ( lenIV >= 0 )
{
- FT_UInt len;
+ for ( count = 0; count < num_subrs; count++ )
+ {
+ FT_UInt len;
- len = offsets[count + 1] - offsets[count];
- cid_decrypt( subr->code[count], len, 4330 );
+ len = offsets[count + 1] - offsets[count];
+ cid_decrypt( subr->code[count], len, 4330 );
+ }
}
subr->num_subrs = num_subrs;