* 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.
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
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;
}