[poppler] A memory leak in CairoFreeTypeFont::create()?

Carlos Garcia Campos carlosgc at gnome.org
Sun Jan 24 04:36:44 PST 2010


Excerpts from mpsuzuki's message of vie ene 08 05:48:18 +0100 2010:
> Hi,
> 
> Now I'm playing with pdftoppm (poppler utils) to attach
> a shell-like interface, to cropping many fragments from
> a signe huge PDF. During the development, I found a
> problem that CairoFreeTypeFont::create() does not free
> an internal buffer pointed by `ff', and valgrind reports
> it as a memory leak.
> 
>     362 CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef
> *xref,
>     363                                              FT_Library lib, GBool
> useCIDs) {
> 
>     [snip]
> 
>     373   FoFiTrueType *ff;
> 
>     [snip]
> 
>     463   case fontCIDType2:
>     464     codeToGID = NULL;
>     465     n = 0;
>     466     if (((GfxCIDFont *)gfxFont)->getCIDToGID()) {
>     467       n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen();
>     468       if (n) {
>     469         codeToGID = (Gushort *)gmallocn(n, sizeof(Gushort));
>     470         memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(),
>     471                 n * sizeof(Gushort));
>     472       }
>     473     } else {
>     474       ff = FoFiTrueType::load(fileName->getCString());
>     475       if (! ff)
>     476         goto err2;
>     477       codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff, &n);
>     478       delete ff;
>     479     }
>     480     codeToGIDLen = n;
>     481     /* Fall through */
> 
>     In the case of CIDFontType2, after codeToGID is obtained
>     from the font file, `ff' is not needed anymore, and deleted
>     at line 478.
> 
>     482   case fontTrueType:
>     483     if (!(ff = FoFiTrueType::load(fileName->getCString()))) {
>     484       error(-1, "failed to load truetype font\n");
>     485       goto err2;
>     486     }
>     487     /* This might be set already for the CIDType2 case */
>     488     if (fontType == fontTrueType) {
>     489       codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff);
>     490       codeToGIDLen = 256;
>     491     }
>     492     if (! _ft_new_face (lib, fileName->getCString(), &face,
> &font_face)) {
>     493       error(-1, "could not create truetype face\n");
>     494       goto err2;
>     495     }
>     496     break;
> 
>     In the case of TrueType, after codeToGID is obtained
>     from the font file, `ff' is not deleted.
> 
> 
> It seems that the buffer pointed by `ff' is not passed to
> the caller (or others), and it might be orphaned. Is it
> possible to delete it, aslike CIDFontType2 case deletes it?
> 
> Following is my short patch. Please give me comment.

Applied to git master and 0.12 branch. Thank you very much. 

> Regards,
> mpsuzuki
> 
> 
> diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc
> index 20e6b9e..f08d893 100644
> --- a/poppler/CairoFontEngine.cc
> +++ b/poppler/CairoFontEngine.cc
> @@ -489,6 +489,7 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont
> *gfxFont, XRef *xref,
>        codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff);
>        codeToGIDLen = 256;
>      }
> +    delete ff;
>      if (! _ft_new_face (lib, fileName->getCString(), &face, &font_face)) {
>        error(-1, "could not create truetype face\n");
>        goto err2;
-- 
Carlos Garcia Campos
PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x523E6462


More information about the poppler mailing list