Commit 97cd12657daf11fea4aee85c94716e3663f94fc8

Ewald Hew 2017-09-28T08:29:33

* src/cid/cidgload.c (cid_slot_load_glyph): Fix memory leak. Reported as https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3489

diff --git a/ChangeLog b/ChangeLog
index c1a9b32..9d0bbbb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2017-09-28  Ewald Hew  <ewaldhew@gmail.com>
+
+	* src/cid/cidgload.c (cid_slot_load_glyph): Fix memory leak.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3489
+
 2017-09-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
 	Bitmap metrics presetting [1/2].
diff --git a/src/cid/cidgload.c b/src/cid/cidgload.c
index e8a2be3..f0b4988 100644
--- a/src/cid/cidgload.c
+++ b/src/cid/cidgload.c
@@ -335,6 +335,7 @@
     PSAux_Service  psaux = (PSAux_Service)face->psaux;
     FT_Matrix      font_matrix;
     FT_Vector      font_offset;
+    FT_Bool        must_finish_decoder = FALSE;
 
 
     if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
@@ -375,6 +376,8 @@
     /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
     /*       if we ever support CID-keyed multiple master fonts     */
 
+    must_finish_decoder = TRUE;
+
     /* set up the decoder */
     decoder.builder.no_recurse = FT_BOOL(
       ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) );
@@ -393,6 +396,8 @@
     /* save new glyph tables */
     psaux->t1_decoder_funcs->done( &decoder );
 
+    must_finish_decoder = FALSE;
+
     /* now set the metrics -- this is rather simple, as    */
     /* the left side bearing is the xMin, and the top side */
     /* bearing the yMax                                    */
@@ -501,6 +506,10 @@
     }
 
   Exit:
+
+    if ( must_finish_decoder )
+      psaux->t1_decoder_funcs->done( &decoder );
+
     return error;
   }