summaryrefslogtreecommitdiffstats
path: root/libass/ass_library.c
diff options
context:
space:
mode:
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-01-07 14:02:06 +0000
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-01-07 14:02:06 +0000
commit7295d0ca77a1f040fb9e50156f373062a213d8dd (patch)
tree7c7f8a317c759df95a1e54f86a0114bc68325916 /libass/ass_library.c
parentd160eb6e3e2f9433f8f8ac20f1a153bf4cd4584d (diff)
downloadlibass-7295d0ca77a1f040fb9e50156f373062a213d8dd.tar.bz2
libass-7295d0ca77a1f040fb9e50156f373062a213d8dd.tar.xz
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
Diffstat (limited to 'libass/ass_library.c')
-rw-r--r--libass/ass_library.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/libass/ass_library.c b/libass/ass_library.c
index 107a6ed..9c41c1d 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);
+ }
+}