mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-13 21:28:01 +02:00
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: Michael Niedermayer <michael@niedermayer.cc>
(cherry picked from commit 4132218b87
)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
b2522f35ec
commit
93456ca3ea
@ -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)
|
|||||||
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] == '/';
|
||||||
|
Loading…
Reference in New Issue
Block a user