Commit 556ad08f03dcd890885eed2cdb8dbe51fae344ab

Werner Lemberg 2002-01-28T13:34:52

* src/type1/t1load.c (parse_encoding): Set `loader->num_chars'. * src/type1/t1load.c (parse_subrs, parse_charstrings): Use copy of `base' string for decrypting to not modify the original data.

diff --git a/ChangeLog b/ChangeLog
index 131d9e4..20ef4b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2002-01-28  Roberto Alameda  <ojancano@geekmail.de>
+
+	* src/type1/t1load.c (parse_encoding): Set `loader->num_chars'.
+
+2002-01-28  Werner Lemberg  <wl@gnu.org>
+
+	* src/type1/t1load.c (parse_subrs, parse_charstrings): Use copy
+	of `base' string for decrypting to not modify the original data.
+
 2002-01-27  Giuliano Pochini  <pochini@shiny.it>
 
 	* src/smooth/ftgrays.c (gray_render_scanline): Fix bug which caused
diff --git a/src/type1/t1load.c b/src/type1/t1load.c
index 817c940..69116f0 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 );