From a8cf42bb7a4f52f81969136fd4544ba8f58df12c Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 4 Jan 2007 16:46:46 +0000 Subject: [PATCH] * 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. --- ChangeLog | 10 ++++++++++ src/base/ftobjs.c | 30 +++++++++++++++++++++++++++++- src/pshinter/pshalgo.c | 2 +- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 28f4bdc1b..9848ef33e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2007-01-04 David Turner + + * 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 * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 7909ea411..2384a27b7 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 c3c972d84..83c07ddf8 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; }