summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@blackbox>2009-07-24 10:06:16 +0200
committerGrigori Goronzy <greg@blackbox>2009-07-24 15:39:20 +0200
commit9d421ddec0a17bb17a77571653f30931b55b7397 (patch)
treecbafe7f90ecb713e912efe28acc3d7ad870e61f9
parent074399f7dcb4c94cc86d87250c05ba497fe26e45 (diff)
downloadlibass-9d421ddec0a17bb17a77571653f30931b55b7397.tar.bz2
libass-9d421ddec0a17bb17a77571653f30931b55b7397.tar.xz
Fix renderer memory leaks
Use the correct free order when freeing a ass_renderer and make sure that the latest list of ass_images is freed, too. Protect the font family string against double free and make sure it is freed in free_render_context. Leaks and access problems were found by valgrind/memcheck.
-rw-r--r--libass/ass_render.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index e0a8d36..7b85706 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -361,12 +361,18 @@ static void free_list_clear(ass_renderer_t *render_priv)
}
}
+static void ass_free_images(ass_image_t *img);
+
void ass_renderer_done(ass_renderer_t *render_priv)
{
ass_font_cache_done(render_priv->cache.font_cache);
ass_bitmap_cache_done(render_priv->cache.bitmap_cache);
ass_composite_cache_done(render_priv->cache.composite_cache);
ass_glyph_cache_done(render_priv->cache.glyph_cache);
+
+ ass_free_images(render_priv->images_root);
+ ass_free_images(render_priv->prev_images_root);
+
if (render_priv->state.stroker) {
FT_Stroker_Done(render_priv->state.stroker);
render_priv->state.stroker = 0;
@@ -379,7 +385,6 @@ void ass_renderer_done(ass_renderer_t *render_priv)
ass_synth_done(render_priv->synth_priv);
if (render_priv && render_priv->eimg)
free(render_priv->eimg);
- free(render_priv);
free(render_priv->text_info.glyphs);
free(render_priv->text_info.lines);
@@ -387,6 +392,7 @@ void ass_renderer_done(ass_renderer_t *render_priv)
free(render_priv->settings.default_family);
free_list_clear(render_priv);
+ free(render_priv);
}
/**
@@ -1924,8 +1930,8 @@ static void reset_render_context(ass_renderer_t *render_priv)
(render_priv->state.style->StrikeOut ? DECO_STRIKETHROUGH : 0);
render_priv->state.font_size = render_priv->state.style->FontSize;
- if (render_priv->state.family)
- free(render_priv->state.family);
+ free(render_priv->state.family);
+ render_priv->state.family = NULL;
render_priv->state.family = strdup(render_priv->state.style->FontName);
render_priv->state.treat_family_as_pattern =
render_priv->state.style->treat_fontname_as_pattern;
@@ -1987,7 +1993,11 @@ init_render_context(ass_renderer_t *render_priv, ass_event_t *event)
static void free_render_context(ass_renderer_t *render_priv)
{
+ free(render_priv->state.family);
ass_drawing_free(render_priv->state.drawing);
+
+ render_priv->state.family = NULL;
+ render_priv->state.drawing = NULL;
}
// Calculate the cbox of a series of points