From 16ba32521bdff295fea70b308150a50bb336b3af Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Wed, 27 May 2015 21:22:11 -0700 Subject: [PATCH] Don't leak the struct_FT_MemoryRec_. We libc::malloc() a struct_FT_MemoryRec_ and pass it to FreeType. We need to libc::free() it as well when FreeType is done with it. --- .../gfx/platform/freetype/font_context.rs | 25 +++++++++++-------- components/servo/Cargo.lock | 1 + 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/components/gfx/platform/freetype/font_context.rs b/components/gfx/platform/freetype/font_context.rs index 313e02f022e..3fb35ab2dc9 100644 --- a/components/gfx/platform/freetype/font_context.rs +++ b/components/gfx/platform/freetype/font_context.rs @@ -40,6 +40,17 @@ extern fn ft_realloc(_mem: FT_Memory, _cur_size: c_long, new_size: c_long, block #[derive(Clone)] pub struct FreeTypeLibraryHandle { pub ctx: FT_Library, + pub mem: FT_Memory, +} + +impl Drop for FreeTypeLibraryHandle { + fn drop(&mut self) { + assert!(!self.ctx.is_null()); + unsafe { + FT_Done_Library(self.ctx); + libc::free(self.mem as *mut c_void); + } + } } #[derive(Clone)] @@ -47,20 +58,12 @@ pub struct FontContextHandle { pub ctx: Rc, } -impl Drop for FreeTypeLibraryHandle { - fn drop(&mut self) { - assert!(!self.ctx.is_null()); - unsafe { FT_Done_Library(self.ctx) }; - } -} - impl FontContextHandle { pub fn new() -> FontContextHandle { unsafe { - let ptr = libc::malloc(mem::size_of::() as size_t); - let allocator: &mut struct_FT_MemoryRec_ = mem::transmute(ptr); - ptr::write(allocator, struct_FT_MemoryRec_ { + let mem: &mut struct_FT_MemoryRec_ = mem::transmute(ptr); + ptr::write(mem, struct_FT_MemoryRec_ { user: ptr::null_mut(), alloc: ft_alloc, free: ft_free, @@ -75,7 +78,7 @@ impl FontContextHandle { FT_Add_Default_Modules(ctx); FontContextHandle { - ctx: Rc::new(FreeTypeLibraryHandle { ctx: ctx }), + ctx: Rc::new(FreeTypeLibraryHandle { ctx: ctx, mem: mem }), } } } diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index b6a757d6513..171d9edebb4 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -479,6 +479,7 @@ dependencies = [ "layers 0.1.0 (git+https://github.com/servo/rust-layers)", "libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", + "net 0.0.1", "script_traits 0.0.1", "time 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",