summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--src/base/ftobjs.c30
-rw-r--r--src/pshinter/pshalgo.c2
3 files changed, 40 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 28f4bdc1..9848ef33 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 7909ea41..2384a27b 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 c3c972d8..83c07ddf 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;
}