From 23a665fa9180a3daeb2a4ebe79d47a79a1a244db Mon Sep 17 00:00:00 2001 From: James Gray Date: Mon, 21 Sep 2015 16:09:03 -0500 Subject: [PATCH 1/2] plug leak in lime_font_get_family_name --- project/src/ExternalInterface.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/project/src/ExternalInterface.cpp b/project/src/ExternalInterface.cpp index 0996db619..b934dbd84 100644 --- a/project/src/ExternalInterface.cpp +++ b/project/src/ExternalInterface.cpp @@ -292,7 +292,10 @@ namespace lime { #ifdef LIME_FREETYPE Font *font = (Font*)(intptr_t)fontHandle; - return alloc_wstring (font->GetFamilyName ()); + wchar_t *name = font->GetFamilyName (); + value result = alloc_wstring (name); + delete name; + return result; #else return 0; #endif @@ -1377,4 +1380,4 @@ extern "C" int lime_register_prims () { return 0; -} \ No newline at end of file +} From 208f1ca8f03832dc829a2c366cba1f6b98e2d810 Mon Sep 17 00:00:00 2001 From: James Gray Date: Mon, 21 Sep 2015 16:10:39 -0500 Subject: [PATCH 2/2] plug leaks in lime.text.Font --- project/include/text/Font.h | 2 ++ project/src/text/Font.cpp | 37 ++++++++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/project/include/text/Font.h b/project/include/text/Font.h index e5ce323c2..44f013f6e 100644 --- a/project/include/text/Font.h +++ b/project/include/text/Font.h @@ -62,7 +62,9 @@ namespace lime { int RenderGlyphs (value indices, Bytes *bytes); void SetSize (size_t size); + void* library; void* face; + void* faceMemory; private: diff --git a/project/src/text/Font.cpp b/project/src/text/Font.cpp index f3e9698f9..679704331 100644 --- a/project/src/text/Font.cpp +++ b/project/src/text/Font.cpp @@ -355,7 +355,9 @@ namespace lime { Font::Font (Resource *resource, int faceIndex) { + this->library = 0; this->face = 0; + this->faceMemory = 0; if (resource) { @@ -372,6 +374,7 @@ namespace lime { FT_Face face; FILE_HANDLE *file = NULL; + unsigned char *faceMemory = NULL; if (resource->path) { @@ -379,6 +382,7 @@ namespace lime { if (!file) { + FT_Done_FreeType (library); return; } @@ -390,19 +394,21 @@ namespace lime { } else { Bytes data = Bytes (resource->path); - unsigned char *buffer = (unsigned char*)malloc (data.Length ()); - memcpy (buffer, data.Data (), data.Length ()); + faceMemory = (unsigned char*)malloc (data.Length ()); + memcpy (faceMemory, data.Data (), data.Length ()); + lime::fclose (file); file = 0; - error = FT_New_Memory_Face (library, buffer, data.Length (), faceIndex, &face); + + error = FT_New_Memory_Face (library, faceMemory, data.Length (), faceIndex, &face); } } else { - unsigned char *buffer = (unsigned char*)malloc (resource->data->Length ()); - memcpy (buffer, resource->data->Data (), resource->data->Length ()); - error = FT_New_Memory_Face (library, buffer, resource->data->Length (), faceIndex, &face); + faceMemory = (unsigned char*)malloc (resource->data->Length ()); + memcpy (faceMemory, resource->data->Data (), resource->data->Length ()); + error = FT_New_Memory_Face (library, faceMemory, resource->data->Length (), faceIndex, &face); } @@ -415,7 +421,9 @@ namespace lime { if (!error) { + this->library = library; this->face = face; + this->faceMemory = faceMemory; /* Set charmap * @@ -439,6 +447,12 @@ namespace lime { } + } else { + + FT_Done_FreeType (library); + + free (faceMemory); + } } @@ -449,12 +463,17 @@ namespace lime { Font::~Font () { - - if (face) { + + if (library) { - //FT_Done_Face ((FT_Face)face); + FT_Done_FreeType ((FT_Library)library); + library = 0; + face = 0; } + + free (faceMemory); + faceMemory = 0; }