Commit 4132218b authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/htmlsubtitles: Replace very slow redundant sscanf() calls by cleaner and faster code

This reduces the worst case from O(n²) to O(n) time

Fixes Timeout
Fixes: 2127/clusterfuzz-testcase-minimized-6595787859427328
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 27c20068
...@@ -56,6 +56,7 @@ int ff_htmlmarkup_to_ass(void *log_ctx, AVBPrint *dst, const char *in) ...@@ -56,6 +56,7 @@ int ff_htmlmarkup_to_ass(void *log_ctx, AVBPrint *dst, const char *in)
char *param, buffer[128], tmp[128]; char *param, buffer[128], tmp[128];
int len, tag_close, sptr = 1, line_start = 1, an = 0, end = 0; int len, tag_close, sptr = 1, line_start = 1, an = 0, end = 0;
SrtStack stack[16]; SrtStack stack[16];
int closing_brace_missing = 0;
stack[0].tag[0] = 0; stack[0].tag[0] = 0;
strcpy(stack[0].param[PARAM_SIZE], "{\\fs}"); strcpy(stack[0].param[PARAM_SIZE], "{\\fs}");
...@@ -83,11 +84,20 @@ int ff_htmlmarkup_to_ass(void *log_ctx, AVBPrint *dst, const char *in) ...@@ -83,11 +84,20 @@ int ff_htmlmarkup_to_ass(void *log_ctx, AVBPrint *dst, const char *in)
and all microdvd like styles such as {Y:xxx} */ and all microdvd like styles such as {Y:xxx} */
len = 0; len = 0;
an += sscanf(in, "{\\an%*1u}%n", &len) >= 0 && len > 0; an += sscanf(in, "{\\an%*1u}%n", &len) >= 0 && len > 0;
if ((an != 1 && (len = 0, sscanf(in, "{\\%*[^}]}%n", &len) >= 0 && len > 0)) ||
(len = 0, sscanf(in, "{%*1[CcFfoPSsYy]:%*[^}]}%n", &len) >= 0 && len > 0)) { if (!closing_brace_missing) {
in += len - 1; if ( (an != 1 && in[1] == '\\')
} else || (in[1] && strchr("CcFfoPSsYy", in[1]) && in[2] == ':')) {
av_bprint_chars(dst, *in, 1); char *bracep = strchr(in+2, '}');
if (bracep) {
in = bracep;
break;
} else
closing_brace_missing = 1;
}
}
av_bprint_chars(dst, *in, 1);
break; break;
case '<': case '<':
tag_close = in[1] == '/'; tag_close = in[1] == '/';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment