From d2a07a1270f6aa2d59193b358796dbe33f6eef7a Mon Sep 17 00:00:00 2001 From: eugeni Date: Mon, 7 Jan 2008 14:02:06 +0000 Subject: Copy font data to ass_library instead of referencing demuxer-owned memory. This fixes segfault when fonts are accessed after demuxer has been closed. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25641 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libass/ass.h | 5 +++++ libass/ass_library.c | 24 +++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) (limited to 'libass') diff --git a/libass/ass.h b/libass/ass.h index b87054489f..e88d69d005 100644 --- a/libass/ass.h +++ b/libass/ass.h @@ -195,6 +195,11 @@ int ass_read_styles(ass_track_t* track, char* fname, char* codepage); */ void ass_add_font(ass_library_t* library, char* name, char* data, int data_size); +/** + * \brief Remove all fonts stored in ass_library object + */ +void ass_clear_fonts(ass_library_t* library); + /** * \brief Calculates timeshift from now to the start of some other subtitle event, depending on movement parameter * \param track subtitle track diff --git a/libass/ass_library.c b/libass/ass_library.c index 107a6eda3f..9c41c1d3fb 100644 --- a/libass/ass_library.c +++ b/libass/ass_library.c @@ -37,6 +37,7 @@ void ass_library_done(ass_library_t* priv) if (priv) { ass_set_fonts_dir(priv, NULL); ass_set_style_overrides(priv, NULL); + ass_clear_fonts(priv); free(priv); } } @@ -84,10 +85,27 @@ static void grow_array(void **array, int nelem, size_t elsize) void ass_add_font(ass_library_t* priv, char* name, char* data, int size) { + int idx = priv->num_fontdata; + if (!name || !data || !size) + return; grow_array((void**)&priv->fontdata, priv->num_fontdata, sizeof(*priv->fontdata)); - priv->fontdata[priv->num_fontdata].name = name; - priv->fontdata[priv->num_fontdata].data = data; - priv->fontdata[priv->num_fontdata].size = size; + + priv->fontdata[idx].name = malloc(strlen(name)); + strcpy(priv->fontdata[idx].name, name); + + priv->fontdata[idx].data = malloc(size); + memcpy(priv->fontdata[idx].data, data, size); + + priv->fontdata[idx].size = size; + priv->num_fontdata ++; } +void ass_clear_fonts(ass_library_t* priv) +{ + int i; + for (i = 0; i < priv->num_fontdata; ++i) { + free(priv->fontdata[i].name); + free(priv->fontdata[i].data); + } +} -- cgit v1.2.3