diff --git a/gst/subparse/gstsubparse.c b/gst/subparse/gstsubparse.c index 5dadb0a336..e3069399da 100644 --- a/gst/subparse/gstsubparse.c +++ b/gst/subparse/gstsubparse.c @@ -683,15 +683,24 @@ subrip_unescape_formatting (gchar * txt) } for (pos = txt; pos != NULL && *pos != '\0'; ++pos) { - if (g_ascii_strncasecmp (pos, "</u>", 10) == 0 || - g_ascii_strncasecmp (pos, "</i>", 10) == 0 || - g_ascii_strncasecmp (pos, "</b>", 10) == 0) { + gchar *tag; + + /* look for start of an escaped closing tag */ + if (g_ascii_strncasecmp (pos, "</", 5) != 0) + continue; + tag = pos + 5; + while (*tag == ' ') + ++tag; + if ((*tag == 'u' || *tag == 'i' || *tag == 'b') && + g_ascii_strncasecmp (tag + 1, ">", 4) == 0) { + gsize tag_len = (guintptr) (tag + 1 + 4 - pos); + pos[0] = '<'; pos[1] = '/'; - pos[2] = g_ascii_tolower (pos[5]); + pos[2] = g_ascii_tolower (*tag); pos[3] = '>'; /* move NUL terminator as well */ - memmove (pos + 4, pos + 10, strlen (pos + 10) + 1); + memmove (pos + 4, pos + tag_len, strlen (pos + tag_len) + 1); pos += 3; } }