avfilter/drawtext: make command processing error-resilient

Prevents crash or interruption in text rendering
if new option string contains invalid values.
This commit is contained in:
Gyan Doshi 2019-05-10 19:13:33 +05:30
parent 98478c05ed
commit 87db1ca632
1 changed files with 40 additions and 11 deletions

View File

@ -862,20 +862,49 @@ static int config_input(AVFilterLink *inlink)
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
{
DrawTextContext *s = ctx->priv;
DrawTextContext *old = ctx->priv;
DrawTextContext *new = NULL;
int ret;
if (!strcmp(cmd, "reinit")) {
int ret;
uninit(ctx);
s->reinit = 1;
if ((ret = av_set_options_string(ctx, arg, "=", ":")) < 0)
return ret;
if ((ret = init(ctx)) < 0)
return ret;
return config_input(ctx->inputs[0]);
}
new = av_mallocz(sizeof(DrawTextContext));
if (!new)
return AVERROR(ENOMEM);
return AVERROR(ENOSYS);
new->class = &drawtext_class;
ret = av_opt_copy(new, old);
if (ret < 0)
goto fail;
ctx->priv = new;
ret = av_set_options_string(ctx, arg, "=", ":");
if (ret < 0) {
ctx->priv = old;
goto fail;
}
ret = init(ctx);
if (ret < 0) {
uninit(ctx);
ctx->priv = old;
goto fail;
}
new->reinit = 1;
ctx->priv = old;
uninit(ctx);
av_freep(old);
ctx->priv = new;
return config_input(ctx->inputs[0]);
} else
return AVERROR(ENOSYS);
fail:
av_log(ctx, AV_LOG_ERROR, "Failed to process command. Continuing with existing parameters.\n");
av_freep(new);
return ret;
}
static int func_pict_type(AVFilterContext *ctx, AVBPrint *bp,