diff options
author | Tim-Philipp Müller <tim@centricular.net> | 2012-12-17 00:59:57 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2012-12-17 01:09:11 +0000 |
commit | 53072a43261c8f45f6b572b7463f83953a4549d6 (patch) | |
tree | 2dbdfe4bfb2ca73fecd0eb0c8a23273d5dc55bc9 | |
parent | 6549db36cd39237b2b6d8312b18594d11ec312a3 (diff) |
ssaparse: ignore invalid UTF-8 in init section
The codec data blob we get from matroskademux with the SSA/ASS
init section is supposed to be valid UTF-8. If it's not, just
continue with the bits that are valid UTF-8 instead of erroring
out. We don't actually parse the init section yet anyway..
https://bugzilla.gnome.org/show_bug.cgi?id=607630
-rw-r--r-- | gst/subparse/gstssaparse.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/gst/subparse/gstssaparse.c b/gst/subparse/gstssaparse.c index ce1639a1f..f6fed8cf2 100644 --- a/gst/subparse/gstssaparse.c +++ b/gst/subparse/gstssaparse.c @@ -150,10 +150,11 @@ gst_ssa_parse_setcaps (GstPad * sinkpad, GstCaps * caps) const GValue *val; GstStructure *s; const guchar bom_utf8[] = { 0xEF, 0xBB, 0xBF }; + const gchar *end; GstBuffer *priv; GstMapInfo map; gchar *ptr; - gsize left; + gsize left, bad_offset; gboolean ret; s = gst_caps_get_structure (caps, 0); @@ -172,7 +173,10 @@ gst_ssa_parse_setcaps (GstPad * sinkpad, GstCaps * caps) gst_buffer_ref (priv); - gst_buffer_map (priv, &map, GST_MAP_READ); + if (!gst_buffer_map (priv, &map, GST_MAP_READ)) + return FALSE; + + GST_MEMDUMP_OBJECT (parse, "init section", map.data, map.size); ptr = (gchar *) map.data; left = map.size; @@ -186,8 +190,13 @@ gst_ssa_parse_setcaps (GstPad * sinkpad, GstCaps * caps) if (!strstr (ptr, "[Script Info]")) goto invalid_init; - if (!g_utf8_validate (ptr, left, NULL)) - goto invalid_utf8; + if (!g_utf8_validate (ptr, left, &end)) { + bad_offset = (gsize) (end - ptr); + GST_WARNING_OBJECT (parse, "Init section is not valid UTF-8. Problem at " + "byte offset %" G_GSIZE_FORMAT, bad_offset); + /* continue with valid UTF-8 data */ + left = bad_offset; + } /* FIXME: parse initial section */ parse->ini = g_strndup (ptr, left); @@ -212,13 +221,6 @@ invalid_init: gst_buffer_unref (priv); return FALSE; } -invalid_utf8: - { - GST_WARNING_OBJECT (parse, "Init section is not valid UTF-8"); - gst_buffer_unmap (priv, &map); - gst_buffer_unref (priv); - return FALSE; - } } static gboolean |