Commit a8cf42bb7a4f52f81969136fd4544ba8f58df12c

David Turner 2007-01-04T16:46:46

* src/pshinter/pshalgo.c: remove a stupid typo that results in no hinting and a memory leak with some large Asian CFF fonts * src/base/ftobjs.c (FT_Done_Library): remove a subtle memory leak which happens when FT_Done_Library is called with opened CFF_Faces in it. We need to close all faces before destroying the modules, or else some bad things (memory leaks) may happen.

diff --git a/ChangeLog b/ChangeLog
index 28f4bdc..9848ef3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2007-01-04  David Turner  <david@freetype.org>
+
+	* src/pshinter/pshalgo.c: remove a stupid typo that results in no
+	hinting and a memory leak with some large Asian CFF fonts
+
+	* src/base/ftobjs.c (FT_Done_Library): remove a subtle memory leak
+	which happens when FT_Done_Library is called with opened CFF_Faces in
+	it. We need to close all faces before destroying the modules, or else
+	some bad things (memory leaks) may happen.
+
 2007-01-02  Werner Lemberg  <wl@gnu.org>
 
 	* src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate):
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 7909ea4..2384a27 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -3758,7 +3758,35 @@
     if ( library->generic.finalizer )
       library->generic.finalizer( library );
 
-    /* Close all modules in the library */
+    /* Close all faces in the library. if we don't do
+     * this, we can have some subtle memory leaks.
+     * for example:
+     *
+     *  - the cff font driver uses the pshinter module in cff_size_done
+     *  - if the pshinter module is destroyed before the cff font driver,
+     *    opened FT_Face objects managed by the driver will not be properly
+     *    destroyed, resulting in a memory leak
+     */
+    {
+      FT_UInt  n;
+
+      for ( n = 0; n < library->num_modules; n++ )
+      {
+        FT_Module  module = library->modules[n];
+        FT_List    faces;
+
+        if ( (module->clazz->module_flags & FT_MODULE_FONT_DRIVER) == 0 )
+          continue;
+
+        faces = &FT_DRIVER(module)->faces_list;
+        while ( faces->head ) {
+          FT_Done_Face( FT_FACE(faces->head->data) );
+        }
+      }
+    }
+
+
+    /* Close all other modules in the library */
 #if 1
     /* XXX Modules are removed in the reversed order so that  */
     /* type42 module is removed before truetype module.  This */
diff --git a/src/pshinter/pshalgo.c b/src/pshinter/pshalgo.c
index c3c972d..83c07dd 100644
--- a/src/pshinter/pshalgo.c
+++ b/src/pshinter/pshalgo.c
@@ -1866,7 +1866,7 @@
       FT_Error  error;
 
 
-      if ( !FT_NEW_ARRAY( strongs, num_strongs ) )
+      if ( FT_NEW_ARRAY( strongs, num_strongs ) )
         return;
     }