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:
parent
98478c05ed
commit
87db1ca632
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user